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.


    Exception when opening ui.View using popover style

    Pythonista
    view exception popover
    2
    12
    8475
    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.
    • skrohmer
      skrohmer last edited by

      I'm not sure, both self.menu.hidden and self.menu.on_screen are always False. They never get True, even if the view is displayed. I have hoped that at least self.menu.on_screen will be True as soon as I see the view.

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

        I understand but the same exception occurs when you try to present two times the same view, even if not popover. You need to close it before the 2nd present.

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

          Try this, only to see the result

          import ui
          from scene import *
          class MyScene(Scene):
          	def setup(self):
          		self.menu = ui.View(frame=(0, 0, 200, 200))
          		self.menu.name = 'popup'
          	def touch_began(self, touch):
          		self.menu.present('popover',popover_location=touch.location)
          		ui.delay(self.popup_close,2)
          	def popup_close(self):
          		self.menu.close()
          run(MyScene())
          
          1 Reply Last reply Reply Quote 0
          • skrohmer
            skrohmer last edited by

            Thanks, good hint, at least this works! The problem which I see at the moment is when I "hide" the popup as described -> close() does not seem to have an effect anymore. I'm still wondering which state the hidden popup has. The class variables don't change, independent if it is not visible, presented or "hidden" by me:

            obj.__dict__ = {}
            obj.alpha = 1.0
            obj.autoresizing = 
            obj.background_color = (0.0, 0.0, 0.0, 0.0)
            obj.bg_color = (0.0, 0.0, 0.0, 0.0)
            obj.border_color = (0.0, 0.0, 0.0, 1.0)
            obj.border_width = 0.0
            obj.bounds = (0.00, 0.00, 200.00, 200.00)
            obj.center = (100.00, 100.00)
            obj.content_mode = 0
            obj.corner_radius = 0.0
            obj.flex = 
            obj.frame = (0.00, 0.00, 200.00, 200.00)
            obj.height = 200.0
            obj.hidden = False
            obj.left_button_items = None
            obj.multitouch_enabled = False
            obj.name = popup
            obj.navigation_view = None
            obj.on_screen = False
            obj.right_button_items = None
            obj.subviews = ()
            obj.superview = None
            obj.tint_color = (0.0, 0.47843137383461, 1.0, 1.0)
            obj.touch_enabled = True
            obj.width = 200.0
            obj.x = 0.0
            obj.y = 0.0
            
            1 Reply Last reply Reply Quote 0
            • cvp
              cvp last edited by cvp

              Yes, I understand. I had checked with

              print(dir(self.menu))
              

              If there was not an unknown (by me) attribute.

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

                You can also try this: when you tap, the menu appears or disappears but its position is not ok

                import ui
                from scene import *
                class MyScene(Scene):
                	def setup(self):
                		pass
                		#self.menu = ui.View(frame=(0, 0, 200, 200))
                	def touch_began(self, touch):
                		try:
                			self.menu = ui.View(frame=(0, 0, 200, 200))
                			self.menu.present('popover',popover_location=touch.location)
                		except: 
                			self.menu.delete()			
                		#ui.delay(self.popup_close,2)
                	#def popup_close(self):
                		#self.menu.close()
                run(MyScene())
                
                1 Reply Last reply Reply Quote 0
                • skrohmer
                  skrohmer last edited by

                  Yes, seems to be better. I will check again which is the best solution for me. I'm still struggling with this popup. Maybe someone else has a hint, too. Maybe @omz can tell us why the popup does not disappear completely when I click beside it.

                  BTW: The position seems to be strange because the coordinate systems are different. The popup placed at position 0,0 appears in the top left corner, but the point 0,0 of the touch coordinates is in the bottom left corner. The Y axes are leading in different directions.

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

                    Strange y axe 🤕

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

                      This seems to be the shortest solution for now:

                      import ui
                      from scene import *
                      
                      class MyScene(Scene):
                      	def setup(self):
                      		pass
                      
                      	def get_viewpos_from_touch(self, touch):
                      		xt, yt = touch.location
                      		xw, yw = ui.get_window_size()
                      		return xt, yw - yt
                      
                      	def touch_began(self, touch):
                      		menu = ui.View(frame=(0, 0, 200, 200))
                      		menu.present('popover', popover_location=self.get_viewpos_from_touch(touch))
                      
                      
                      run(MyScene())
                      

                      I can live with that at least at the moment. I hope that "hiding" the popup as I already explained does not result in memory leaks. ;-)

                      However, I'm still interested in any information which explains the strange behavior mentioned above: Why does the popup not close completely?

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

                        I think that at each touch_began run, you create a new instance of ui.View, without deleting the previous one! Not vital but not the deal, I suppose.

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