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.


    How to use a custom class for a whole UI

    Pythonista
    3
    7
    4987
    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.
    • GenericUser
      GenericUser last edited by

      Hi,
      My goal is to make a subclass of Ui.View and use it as a class for a whole UI like in a pyui file made in UI builder. How does that work? I don't get buttons wired up to actions in the class; it only works for methods outside a class. Any help?

      I came to that issue since I defined a global SQLite instance and cursor and tried to use it in defs wired up to buttons, all without any class, but then it fails to execute sqllite since different threads being used.

      Greetings!

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

        In your .pyui file, you must make sure to set the Custom View Class to the name of your class and then use code like http://omz-forums.appspot.com/pythonista/post/5588266841538560#post-5278865450598400

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

          Thanks, strange syntax.

          I somehow expected something like setting the custom class of the pyui and then all methods set as action in the Ui builder would have referred to corresponding methods of the set custom subclass of View used for it. Instead, one needs to wire up all actions by code. Maybe that is something for an upcoming update?

          But my initial problem still exists: how can one deal with sqllite3 in an object based manner? As soon as executions are done by a method of a class whereas pointer and connection are instance variables, I get an error saying that they are running in different threads?

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

            You might try putting the @ui.in_background decorator on the line just before your functions or methods that use sqllite3:

            @ui.in_background
            def my_sqllite3_function():
                [ ... ]
            

            Can you post a github repo with some of your code in it so we can debug as a team? IETDPCTEP.

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

              You don't have to wire up all the actions in code if you follow this pattern:

              class MyViewController (object):
                def load_view(self):
                  self.view = ui.load_view()
              
                def some_action(self, sender):
                  print 'action 1'
              
                def some_other_action(self, sender):
                  print 'action 2'
              
              controller = MyViewController()
              controller.view.present()
              

              You'd then set an action in the pyui file as self.some_action (not just some_action), and it'll automagically be connected to the object that's loading the view (an instance of MyViewController in this case).

              Setting a custom view class in the pyui file isn't really intended for connecting actions, it's a way to do things like custom drawing and touch handling.

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

                omz, In the controller scenario above, what would the best way to catch ui.View.did_load(self) signal which should come after ui.load_view() completes?

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

                  @ccc You'd have to use a custom view class for this, though if that's the only thing you need a custom view for, you could consider just putting the same logic into your own load_view method. There's no reason you couldn't do both btw, i.e. use a controller to load the view, as shown above, and still have a custom class for the view itself.

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