• Phuket2

    @nerdtron , no problems. I think for this example that flex would be the best and easiest. However, when I tried doing it, I had a brain freeze! Its been a long time since I have done it. Pls dont take that as it is hard to do. Once you have it in your head, normally its simple.
    I am sure someone else here will chime in with the correct way to set the flex settings.

    The example I have put below is still a good a good way to know. Its using a custom view. One of the callbacks you get when you have a Custom View Class is layout. Its called by the ui automatically (if you have a method called layout) when you need to respond to changes in your views height or width. Its worth having a read through the docs about Custom Views.
    They are easy to make and give you a lot more flexibility and some extra functionality.

    Anyway, I hope this also helps

    import ui
    
    class MyClass(ui.View):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            # create the field and button
            self.in_fld = ui.TextField()
            self.post_btn = ui.Button(title='Add Item',
                                      bg_color='orange',
                                      corner_radius=6,
                                      action=self.btn_action,
                                      )
                                      
            # do some static adjustments to button and field properites
            # properties that we dont need to calculate in layout
            self.post_btn.size_to_fit()
            self.post_btn.width += 4
            self.post_btn.y = 2
            
            self.in_fld.x = 2
            self.in_fld.y = 2
            self.in_fld.height = self.post_btn.height
            
            self.add_subview(self.in_fld)
            self.add_subview(self.post_btn)
            
        def btn_action(self, sender):
            # just to show its working append '@' to the in_fld text
            self.in_fld.text += '@'
            
        def layout(self):
            '''
            This method is called by the ui automatically when required,
            such as orientation change.
            '''
            
            # only need to adjust the width of the fld and the x pos
            # of the btn for this case
            self.in_fld.width = self.width - self.post_btn.width - 6
            self.post_btn.x = self.in_fld.frame.max_x + 2
            
    if __name__ == '__main__':
        mc = MyClass()
        mc.present()
    
    '''
    This would also work as expected    
    if __name__ == '__main__':
        f=(0, 0, 320, 480)
        mc = MyClass(frame=f)
        mc.present('sheet')
    '''
    

    posted in Pythonista read more
  • Phuket2

    @nerdtron, I think the below gives you what you want. I didn't try and get your flex values correct. If you look in the ui.designer, this will help get the settings correct. But you still need to size and position your ui objects for flex to work. Hope it helps.
    Also the + 2 and +4 etc in the code is for some margins between the view frame and the ui objects.

    import ui
    
    view = ui.View()
    view.name = 'test UI'
    view.background_color = 'black'
    
    r = ui.Button(title='Add Item', bg_color='orange',
                  width=100, height=100, corner_radius=6)
    r.size_to_fit()          # resizes the button, but a little tight
    r.width += 4             # add a few extra pixels
    
    # using get_window_size()[0], could use ui.get_screen_size()[0]
    # get_window_size should work on split screens also
    r.x = ui.get_window_size()[0] - r.width - 2 # returns a tuple (w,h)
    r.y = 2
    #r.background_color = 'orange'
    #r.flex = 'BL'
    view.add_subview(r)
    
    s = ui.TextField(width=r.frame.min_x - 4,
                     height=r.height)
    s.x = 2
    s.y = 2
    #s.flex = 'BR'
    view.add_subview(s)
    s.begin_editing()        # This gets the text field ready for input.
                             # You can comment this out, if you dont want
                             # it to behave like this
    view.present('fullscreen')
    

    posted in Pythonista read more
  • Phuket2

    This is only a stab in the dark. But often when I have had problems with something that works some of the time and not other times. The answer is normally relates to timing, ui/blocking etc.
    So using the @ui.in_background decorator could help with the ui blocking, sometimes calling time.sleep(1) can help. As I say I am guessing, but I recognise the general pattern of sometimes this works other times it does not from the problems I have had. A ui blocking or timing issue. Hope it helps, I know others here could be more concise to the exact problem, maybe this is enough food for thought.

    posted in Pythonista read more
  • Phuket2

    @JonB , yeah i realise that. Like you, I was trying to filter how much to say while still being helpful. It's tricky :)

    posted in Pythonista read more
  • Phuket2

    @smiddleton, one change you could make, to make things more explicit is to pass an action param to your BlunoBeetle class like below. It's not the whole story, but I think its a step in the right direction.

    class BlunoBeetle (object):
        def __init__(self, action):
           ...
           self.b.action = action
    
    def my_action(sender):
        print(sender)
    
    mngr = BlunoBeetle(my_action)
    
    

    posted in Pythonista read more
  • Phuket2

    @dwildbore , hi I used the example below from the Pythonista docs. I am using apple Airpods on iPad 12.5' 2nd gen. The sound worked fine for me. When the AirPods in, the speech came though them and after removal the sound come out of the speaker. I didn't have a wired pair of earphones handy to see if it worked differently or not.

    import speech
    import time
    
    def finish_speaking():
        # Block until speech synthesis has finished
        while speech.is_speaking():
            time.sleep(0.1)
    
    # US English:
    speech.say('Hello World', 'en_US')
    finish_speaking()
    # Spanish:
    speech.say('Hola mundo', 'es_ES')
    finish_speaking()
    # German:
    speech.say('Hallo Welt', 'de_DE')
    finish_speaking()
    

    posted in Pythonista read more
  • Phuket2

    @cvp , I just wanted to say another nice use of the update method. It's fairly easy for me to read your code and understand the logic flow. If you had to use threads and use decorators etc... all of a sudden its starts to look complex to someone like me. Also it appears that even very good Python programmers are not immune to different side effects when using threads and ui interaction. The update method just seems to work!
    Just saying :)

    posted in Pythonista read more
  • Phuket2

    @Sabarblatoe , no problems. There seems to be a few little quirks with this way that I dont remember from before. But I think its still really nice. But I think it will work as you expect. Once you have returned from the super() call, its the same as if you have created a Custom ui class by hand.

    posted in Pythonista read more
  • Phuket2

    In the example above, if you say want to set the action attr of a ui.Button in the ui Designer, you cant refer to self to access a method in your class. In the case of the example above, the class is named MyClass, so if you had a method in MyClass called hit, in the ui Designer in the action property of the btn you would enter MyClass.hit, not self.hit.
    If your action is a func in the same source file you would do as normal, just enter the name of the func.

    I cant remember if it was always like this. It's possible that @omz made some changes to prevent injection attacks. I thought before that self.method worked. But maybe I am dreaming.

    Regardless many things can be done with pyui files. It's worth searching the forum.

    posted in Pythonista read more

Internal error.

Oops! Looks like something went wrong!