omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    I thought about spacing my questions, but... scene.present_modal_scene issues

    Pythonista
    2
    7
    3829
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • WTFruit
      WTFruit last edited by

      I do feel bad, I don't want to be nagging but since there aren't 3rd-party resources for most of my questions, and I'm occasionally bumping into problems that I can't seem to figure out, I don't think I have anywhere else to go.

      I'm trying to work out multiple-scene situations now. I thought the first possibility sounded very easy to implement: use present_modal_scene to display a scene on top of the original one. Unfortunately, even though everything looks right to me and I'm doing it exactly the same way as the example games (as far as I can tell), I'm getting an error.

      Secondarily, I don't see an elegant way to move between scenes. Currently I have noticed that I can create another scene and run it whenever I want but it just puts it on top of the previous one, which is still running in the background and when I hit the "x", it takes me to the original scene. That doesn't seem like an ideal outcome.

      So, the first problem. Here's my modal scene code:

      import scene
      import ui
      
      class Scene1(scene.Scene):
      
         def __init__(self):
            pass
      
         def touch_began(self, touch):
            self.menu = Scene2()
            self.present_modal_scene(self.menu)
      
      
      class Scene2(scene.Scene):
      
         def __init__(self):
            pass
      
      
      scene.run(Scene1())
      

      When I run that code it starts fine but when I tap to bring up the second scene, I get this error:

      ValueError: max() arg is an empty sequence

      I'm very stumped. I feel like it couldn't be a simpler thing but I've hit a wall.

      The second problem (the general ability to switch between scenes), I don't even know where to begin with because I can't find any examples or info in the documentation.

      Sorry for asking so many questions!

      1 Reply Last reply Reply Quote 0
      • omz
        omz last edited by

        I haven't run your code yet, but I think the problem is mostly that your __init__ methods are empty. That way, you're preventing the default initialization, which probably leads to weird errors down the line because variables that the scene expects to be there while running aren't initialized, etc.

        You'd either have to call the base class's __init__ in your own initialization, or remove your __init__ methods entirely (it's often more convenient to use setup instead of __init__ for scenes).

        WTFruit 1 Reply Last reply Reply Quote 0
        • WTFruit
          WTFruit @omz last edited by

          @omz

          Fair point that I never thought of, but I removed those without any change. Same error :/

          1 Reply Last reply Reply Quote 0
          • omz
            omz last edited by

            Ah, I just ran the code, and it turns out that there is also a bug in the scene module that makes present_modal_scene not work when the presenting scene has no content. The reason is that it's trying to set the z position (layer ordering) to the maximum of its children, but that fails when there are no children... You can work around this by just adding a dummy Node to the scene.

            WTFruit 1 Reply Last reply Reply Quote 0
            • WTFruit
              WTFruit @omz last edited by

              @omz

              Hmmm interesting! I'll try that out shortly then. Any advice on multiple "main" scenes and how to more properly switch between them?

              1 Reply Last reply Reply Quote 0
              • omz
                omz last edited by

                @WTFruit You can set the self.view.scene attribute, though you'll have to call setup manually then. Here's a minimal example to illustrate:

                import scene
                
                class Scene1(scene.Scene):
                	def setup(self):
                		self.background_color = 'green'
                		
                	def touch_began(self, touch):
                		next_scene = Scene2()
                		self.view.scene = next_scene
                		next_scene.setup()
                		
                class Scene2(scene.Scene):
                	def setup(self):
                		self.background_color = 'red'
                	
                		
                scene.run(Scene1())
                
                
                WTFruit 1 Reply Last reply Reply Quote 0
                • WTFruit
                  WTFruit @omz last edited by

                  @omz (or anyone else reading this)

                  I finally got an implementation of the modal_scene working (took me long enough), it brings up the modal scene and everything. But it still gives me the same initial error at the moment that the modal scene is called. Is there anything I can do about that?

                  Thank you for the scene-change code by the way, it works like a charm. Although I was curious why this works:

                  self.menu = Scene2()
                  self.present_modal_scene(self.menu)
                  

                  But not this:

                  self.present_modal_scene(Scene2())
                  

                  I guess I'm misunderstanding the use of self.menu, I assumed it was basically a pointer, a stand-in for the other phrasing of the code (Scene2()).

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post
                  Powered by NodeBB Forums | Contributors