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.


    pythonista UI

    Pythonista
    4
    256
    161224
    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.
    • shinya.ta
      shinya.ta last edited by

      My name is Takagaki.

      I have a visually impaired daughter-in-law.

      I want to make an application for my wife.

      I would like to create an application to move the cursor of the text field with pythonisa UI for inputting text in iPhone.

      I would like to make a button called the left, the right, the top, the bottom, the text and the end of the sentence, but I can't tell the string injury with the UI. I am in trouble.

      What should I do to operate the cursor?

      cvp 1 Reply Last reply Reply Quote 0
      • cvp
        cvp @shinya.ta last edited by

        @shinya.ta Please try this and tell me if I correctly understood

        import ui
        from objc_util import *
        
        v = ui.View()
        v.frame = (0,0,500,300)
        
        tf = ui.TextField()
        tf.name = 'TextField'
        tf.frame = (10,250,480,32)
        tf.text = 'this is the sentence'
        v.add_subview(tf)
        
        b_left = ui.Button()
        b_left.frame = (10,10,100,32)
        b_left.title = 'left'
        b_left.background_color = 'white'
        b_left.border_width = 1
        def b_left_action(sender):
        	tf = sender.superview['TextField']
        	tfo = ObjCInstance(tf).textField()
        	begin = tfo.beginningOfDocument()
        	tfo.selectedTextRange = tfo.textRangeFromPosition_toPosition_(begin,begin)
        b_left.action = b_left_action
        v.add_subview(b_left)
        
        b_right = ui.Button()
        b_right.frame = (10,50,100,32)
        b_right.title = 'right'
        b_right.background_color = 'white'
        b_right.border_width = 1
        def b_right_action(sender):
        	tf = sender.superview['TextField']
        	tfo = ObjCInstance(tf).textField()
        	begin = tfo.beginningOfDocument()
        	l = len(tf.text)
        	end = tfo.positionFromPosition_offset_(begin, l)
        	tfo.selectedTextRange = tfo.textRangeFromPosition_toPosition_(end,end)
        b_right.action = b_right_action
        v.add_subview(b_right)
        
        v.present('sheet')
        
        shinya.ta 4 Replies Last reply Reply Quote 0
        • low
          low last edited by

          I'm not sure if the forum is glitching, but I think you posted this 3 times. Please don't spam, and goodluck making your app!

          1 Reply Last reply Reply Quote 0
          • shinya.ta
            shinya.ta @cvp last edited by

            @cvp

            Dear.@cvp

            I tried it immediately.

            I'm sorry.
            I'm not good at English, so I didn't get well.
            The first posting was wrong.

            It was not text field but text view.

            I want you to move the cursor one by one.

            Also, you need to move up and down.

            What should I do?

            cvp 2 Replies Last reply Reply Quote 0
            • cvp
              cvp @shinya.ta last edited by

              @shinya.ta Easier for a TextView, you have to set selected_range attribute at wanted position

              tv.selected_range = (0,0) will put at top
              
              1 Reply Last reply Reply Quote 0
              • cvp
                cvp @shinya.ta last edited by

                @shinya.ta try this last one

                import ui
                from objc_util import *
                
                v = ui.View()
                v.frame = (0,0,500,320)
                v.name = 'Move cursor in TextView'
                
                tv = ui.TextView()
                tv.name = 'TextView'
                tv.frame = (120,10,370,300)
                tv.font = ('Arial Rounded MT Bold',24)
                tv.text = 'this is the sentence'
                v.add_subview(tv)
                
                b_top = ui.Button()
                b_top.frame = (10,10,100,32)
                b_top.title = 'begin'
                b_top.background_color = 'white'
                b_top.border_width = 1
                def b_top_action(sender):
                    tv = sender.superview['TextView']
                    tv.selected_range = (0,0)
                b_top.action = b_top_action
                v.add_subview(b_top)
                
                b_left = ui.Button()
                b_left.frame = (10,50,100,32)
                b_left.title = 'left'
                b_left.background_color = 'white'
                b_left.border_width = 1
                def b_left_action(sender):
                    tv = sender.superview['TextView']
                    i = tv.selected_range[0] - 1
                    if i < 0:
                    	i = 0
                    tv.selected_range = (i,i)
                b_left.action = b_left_action
                v.add_subview(b_left)
                
                b_right = ui.Button()
                b_right.frame = (10,90,100,32)
                b_right.title = 'right'
                b_right.background_color = 'white'
                b_right.border_width = 1
                def b_right_action(sender):
                    tv = sender.superview['TextView']
                    i = tv.selected_range[0] + 1
                    l = len(tv.text)
                    if i > l:
                    	i = l
                    #tv.selected_range = (i,i) # refused if i = len(tv.text)
                    tvo = ObjCInstance(tv)
                    p1 = tvo.positionFromPosition_offset_(tvo.beginningOfDocument(), i)
                    p2 = p1
                    tvo.selectedTextRange = tvo.textRangeFromPosition_toPosition_(p1,p2)
                b_right.action = b_right_action
                v.add_subview(b_right)
                
                b_bottom = ui.Button()
                b_bottom.frame = (10,130,100,32)
                b_bottom.title = 'end'
                b_bottom.background_color = 'white'
                b_bottom.border_width = 1
                def b_bottom_action(sender):
                    tv = sender.superview['TextView']
                    l = len(tv.text) 
                    #tv.selected_range = (l,l) # refused if l = len(tv.text)
                    tvo = ObjCInstance(tv)
                    p1 = tvo.positionFromPosition_offset_(tvo.beginningOfDocument(), l)
                    p2 = p1
                    tvo.selectedTextRange = tvo.textRangeFromPosition_toPosition_(p1,p2)
                b_bottom.action = b_bottom_action
                v.add_subview(b_bottom)
                
                def get_xy(tv):
                    tvo = ObjCInstance(tv)
                    x_y = []
                    for i in range(0,len(tv.text)+1):	# x,y of each character
                      p1 = tvo.positionFromPosition_offset_(tvo.beginningOfDocument(), i)
                      rge = tvo.textRangeFromPosition_toPosition_(p1,p1)
                      rect = tvo.firstRectForRange_(rge)	# CGRect
                      x,y = rect.origin.x,rect.origin.y
                      if i == len(tv.text):
                        if i > 0:
                          x,y = x_y[i-1]
                        else:
                          # text is empty
                          x,y = 0,0
                      x_y.append((x,y))
                    return x_y
                    
                b_up = ui.Button()
                b_up.frame = (10,170,100,32)
                b_up.title = 'up'
                b_up.background_color = 'white'
                b_up.border_width = 1
                def b_up_action(sender):
                    tv = sender.superview['TextView']
                    x_y = get_xy(tv)
                    c = tv.selected_range[0] 
                    xc,yc = x_y[c]
                    i = c - 1
                    while i >=  0:
                      x,y = x_y[i]
                      if y < yc:
                        # previous row
                        if x <= xc:
                          tv.selected_range = (i,i)
                          return
                      i = i - 1
                b_up.action = b_up_action
                v.add_subview(b_up)
                
                b_down = ui.Button()
                b_down.frame = (10,210,100,32)
                b_down.title = 'down'
                b_down.background_color = 'white'
                b_down.border_width = 1
                def b_down_action(sender):
                    tv = sender.superview['TextView']
                    print(tv.selected_range,len(tv.text))
                    x_y = get_xy(tv)
                    c = tv.selected_range[0] 
                    #print(x_y,c)
                    xc,yc = x_y[c]
                    i = c - 1
                    while i < len(tv.text):
                      x,y = x_y[i]
                      if y > yc:
                        # next row
                        if x >= xc:
                          tv.selected_range = (i,i)
                          return
                        else:
                          if (i+1) < len(tv.text):
                            if x_y[i+1][1] > y: # i = last character of row under cursor
                              tv.selected_range = (i,i)
                              return
                            else:
                              pass	# try next x
                          else:
                            # last character of last row
                            tv.selected_range = (i,i)
                            return
                      i = i + 1
                b_down.action = b_down_action
                v.add_subview(b_down)
                
                v.present('sheet')
                tv.selected_range = (0,0)
                tv.begin_editing()
                
                1 Reply Last reply Reply Quote 0
                • shinya.ta
                  shinya.ta @cvp last edited by

                  @cvp

                  Dear.@cvp

                  Thank you very much indeed.

                  I tried it today, and it went well.

                  Then, I change the size of my wife's iPhone to the size of my wife's iPhone and make it easy to use.

                  My wife's iPhone is an iPhone seven plus.

                  My wife's iPhone is an iPhone seven plus.

                  1 Reply Last reply Reply Quote 0
                  • shinya.ta
                    shinya.ta @cvp last edited by

                    @cvp

                    Please tell me again if we can't tell you.

                    cvp 1 Reply Last reply Reply Quote 0
                    • cvp
                      cvp @shinya.ta last edited by

                      @shinya.ta Sorry, I didn't understand your last post, I have to say that English is not my mother language too πŸ˜…

                      shinya.ta 2 Replies Last reply Reply Quote 0
                      • shinya.ta
                        shinya.ta @cvp last edited by

                        @cvp

                        I made this in the test now.

                        I will remodel this and make it a keyboard application for iPhone.

                        import ui

                        number = 0

                        def plus(sender):

                        global number
                        textview = sender.superview['textview1']
                        
                        number = number + 1
                        textview.text = str(number)
                        

                        def minus(sender):

                        global number
                        textview = sender.superview['textview1']
                        
                        number = number - 1
                        textview.text = str(number)
                        
                        # 10δ»₯δΈŠγ γ£γŸγ‚‰θ΅€γ«γ™γ‚‹
                        if number >= 10:
                        	  textview.text_color = 'red'
                        

                        γ‚―γƒͺγ‚’γƒœγ‚Ώγƒ³γ‚’γ‚Ώγƒƒγƒ—γ—γŸγ¨γγ«ε‘Όγ°γ‚Œγ‚‹γƒ‘γ‚Ύγƒƒγƒˆ

                        def clear(sender):
                        global number
                        textview = sender.superview['textview1']

                          number = 0
                          textview.text = str(number)
                          
                          #θ‰²γ‚’ι»’γ«ζˆ»γ™
                          textview_color = 'black'
                        

                        v = ui.load_view()
                        v.present('sheet')

                        1 Reply Last reply Reply Quote 0
                        • shinya.ta
                          shinya.ta @cvp last edited by

                          @cvp
                          Please tell me again when it is difficult.
                          I'm sorry.

                          cvp 1 Reply Last reply Reply Quote 0
                          • cvp
                            cvp @shinya.ta last edited by

                            @shinya.ta Little errors in clear def
                            I don't have your .pyui file, thus tried this

                            import ui
                            
                            number = 0
                            
                            def plus(sender):
                            	global number
                            	textview = sender.superview['textview1']
                            	number = number + 1
                            	textview.text = str(number)
                            def minus(sender):
                            	global number
                            	textview = sender.superview['textview1']
                            	number = number - 1
                            	textview.text = str(number)
                            	# 10δ»₯δΈŠγ γ£γŸγ‚‰θ΅€γ«γ™γ‚‹
                            	if number >= 10:
                            		textview.text_color = 'red'
                            #γ‚―γƒͺγ‚’γƒœγ‚Ώγƒ³γ‚’γ‚Ώγƒƒγƒ—γ—γŸγ¨γγ«ε‘Όγ°γ‚Œγ‚‹γƒ‘γ‚Ύγƒƒγƒˆ
                            def clear(sender):
                            	global number
                            	textview = sender.superview['textview1']
                            	#θ‰²γ‚’ι»’γ«ζˆ»γ™
                            	number = 0
                            	textview.text = str(number)
                            	textview.text_color = 'black'
                            
                            #v = ui.load_view()
                            v = ui.View()
                            v.frame = (0,0,400,400)
                            
                            tv = ui.TextView(name='textview1')
                            tv.frame = (120,10,260,64)
                            v.add_subview(tv)
                            
                            b_plus =ui.Button(title='plus')
                            b_plus.background_color = 'white'
                            b_plus.frame = (10,10,100,32)
                            b_plus.action = plus
                            v.add_subview(b_plus)
                            
                            b_minus =ui.Button(title='minus')
                            b_minus.background_color = 'white'
                            b_minus.frame = (10,60,100,32)
                            b_minus.action = minus
                            v.add_subview(b_minus)
                            
                            b_clear =ui.Button(title='clear')
                            b_clear.background_color = 'white'
                            b_clear.frame = (10,110,100,32)
                            b_clear.action = clear
                            v.add_subview(b_clear)
                            
                            
                            v.present('sheet')
                            
                            shinya.ta 3 Replies Last reply Reply Quote 0
                            • shinya.ta
                              shinya.ta @cvp last edited by

                              @cvp

                              Wonderful!

                              Now I have a hint of changing the size.

                              Thank you very much.

                              1 Reply Last reply Reply Quote 0
                              • shinya.ta
                                shinya.ta @cvp last edited by

                                @cvp

                                Dear.@cvp

                                I changed to iPhone size.
                                I was able to change it well based on the hint.

                                Also, I would like to add delete Key, NextKey, and AllClearKey.

                                Where should I enter?

                                1 Reply Last reply Reply Quote 0
                                • shinya.ta
                                  shinya.ta @cvp last edited by

                                  @cvp

                                  I want to make a AllClearKey.

                                  and What should I do with the button to change the keyboard?

                                  1 Reply Last reply Reply Quote 0
                                  • shinya.ta
                                    shinya.ta @cvp last edited by

                                    @cvp

                                    import ui
                                    from objc_util import *

                                    v = ui.View()
                                    v.frame = (0,0,333,555)
                                    v.name = 'Move cursor in TextView'

                                    tv = ui.TextView()
                                    tv.name = 'TextView'
                                    tv.frame = (0,0,333,296)
                                    tv.font = ('Arial Rounded MT Bold',24)
                                    tv.text = 'this is the sentence'
                                    v.add_subview(tv)

                                    b_top = ui.Button()
                                    b_top.frame = (5,310,78,78)
                                    b_top.title = 'ζ–‡ι ­'
                                    b_top.background_color = 'white'
                                    b_top.border_width = 1
                                    def b_top_action(sender):
                                    tv = sender.superview['TextView']
                                    tv.selected_range = (0,0)
                                    b_top.action = b_top_action
                                    v.add_subview(b_top)

                                    b_left = ui.Button()
                                    b_left.frame = (47,394,78,78)
                                    b_left.title = 'β¬…οΈŽ'
                                    b_left.background_color = 'white'
                                    b_left.border_width = 1
                                    def b_left_action(sender):
                                    tv = sender.superview['TextView']
                                    i = tv.selected_range[0] - 1
                                    if i < 0:
                                    i = 0
                                    tv.selected_range = (i,i)
                                    b_left.action = b_left_action
                                    v.add_subview(b_left)

                                    b_right = ui.Button()
                                    b_right.frame = (212,394,78,78)
                                    b_right.title = '➑︎︎'
                                    b_right.background_color = 'white'
                                    b_right.border_width = 1
                                    def b_right_action(sender):
                                    tv = sender.superview['TextView']
                                    i = tv.selected_range[0] + 1
                                    l = len(tv.text)
                                    if i > l:
                                    i = l
                                    #tv.selected_range = (i,i) # refused if i = len(tv.text)
                                    tvo = ObjCInstance(tv)
                                    p1 = tvo.positionFromPosition_offset_(tvo.beginningOfDocument(), i)
                                    p2 = p1
                                    tvo.selectedTextRange = tvo.textRangeFromPosition_toPosition_(p1,p2)
                                    b_right.action = b_right_action
                                    v.add_subview(b_right)

                                    b_bottom = ui.Button()
                                    b_bottom.frame = (130,394,78,78)
                                    b_bottom.title = 'ζ–‡ζœ«'
                                    b_bottom.background_color = 'white'
                                    b_bottom.border_width = 1
                                    def b_bottom_action(sender):
                                    tv = sender.superview['TextView']
                                    l = len(tv.text)
                                    #tv.selected_range = (l,l) # refused if l = len(tv.text)
                                    tvo = ObjCInstance(tv)
                                    p1 = tvo.positionFromPosition_offset_(tvo.beginningOfDocument(), l)
                                    p2 = p1
                                    tvo.selectedTextRange = tvo.textRangeFromPosition_toPosition_(p1,p2)
                                    b_bottom.action = b_bottom_action
                                    v.add_subview(b_bottom)

                                    def get_xy(tv):
                                    tvo = ObjCInstance(tv)
                                    x_y = []
                                    for i in range(0,len(tv.text)+1): # x,y of each character
                                    p1 = tvo.positionFromPosition_offset_(tvo.beginningOfDocument(), i)
                                    rge = tvo.textRangeFromPosition_toPosition_(p1,p1)
                                    rect = tvo.firstRectForRange_(rge) # CGRect
                                    x,y = rect.origin.x,rect.origin.y
                                    if i == len(tv.text):
                                    if i > 0:
                                    x,y = x_y[i-1]
                                    else:
                                    # text is empty
                                    x,y = 0,0
                                    x_y.append((x,y))
                                    return x_y

                                    b_up = ui.Button()
                                    b_up.frame = (130,310,78,78)
                                    b_up.title = 'β¬†οΈŽ'
                                    b_up.background_color = 'white'
                                    b_up.border_width = 1
                                    def b_up_action(sender):
                                    tv = sender.superview['TextView']
                                    x_y = get_xy(tv)
                                    c = tv.selected_range[0]
                                    xc,yc = x_y[c]
                                    i = c - 1
                                    while i >= 0:
                                    x,y = x_y[i]
                                    if y < yc:
                                    # previous row
                                    if x <= xc:
                                    tv.selected_range = (i,i)
                                    return
                                    i = i - 1
                                    b_up.action = b_up_action
                                    v.add_subview(b_up)

                                    b_down = ui.Button()
                                    b_down.frame = (130,475,78,78)
                                    b_down.title = 'β¬‡οΈŽ'
                                    b_down.background_color = 'white'
                                    b_down.border_width = 1
                                    def b_down_action(sender):
                                    tv = sender.superview['TextView']
                                    print(tv.selected_range,len(tv.text))
                                    x_y = get_xy(tv)
                                    c = tv.selected_range[0]
                                    #print(x_y,c)
                                    xc,yc = x_y[c]
                                    i = c - 1
                                    while i < len(tv.text):
                                    x,y = x_y[i]
                                    if y > yc:
                                    # next row
                                    if x >= xc:
                                    tv.selected_range = (i,i)
                                    return
                                    else:
                                    if (i+1) < len(tv.text):
                                    if x_y[i+1][1] > y: # i = last character of row under cursor
                                    tv.selected_range = (i,i)
                                    return
                                    else:
                                    pass # try next x
                                    else:
                                    # last character of last row
                                    tv.selected_range = (i,i)
                                    return
                                    i = i + 1
                                    b_down.action = b_down_action
                                    v.add_subview(b_down)

                                    v.present('sheet')
                                    tv.selected_range = (0,0)
                                    tv.begin_editing()

                                    v = ui.load_view()
                                    v.present('sheet')

                                    cvp 4 Replies Last reply Reply Quote 0
                                    • cvp
                                      cvp @shinya.ta last edited by cvp

                                      @shinya.ta First of all, on this forum, you have to insert your code between two lines of ```
                                      Only to keep the indentation and have a good visibility (3 back quote)
                                      Or use the button above with </>

                                      1 Reply Last reply Reply Quote 0
                                      • cvp
                                        cvp @shinya.ta last edited by

                                        @shinya.ta Then, I don't understand your request.
                                        Do you need new buttons like led, right,... or keys in the keyboard?
                                        And what exactly are the wanted functions?
                                        Del exists as back on the keyboard
                                        Next is right, isn'it?
                                        Clear is delete all?

                                        1 Reply Last reply Reply Quote 0
                                        • cvp
                                          cvp @shinya.ta last edited by

                                          @shinya.ta already del with position on iPad

                                          b_del = ui.Button()
                                          b_del.frame = (10,250,100,32)
                                          b_del.title = 'del'
                                          b_del.background_color = 'white'
                                          b_del.border_width = 1
                                          def b_del_action(sender):
                                              tv = sender.superview['TextView']
                                              i = tv.selected_range[0]
                                              if i < len(tv.text):
                                                  tv.text = tv.text[:i] + tv.text[i+1:]
                                                  #tv.selected_range = (i,i) # refused if i = len(tv.text)
                                                  tvo = ObjCInstance(tv)
                                                  p1 = tvo.positionFromPosition_offset_(tvo.beginningOfDocument(), i)
                                                  p2 = p1
                                                  tvo.selectedTextRange = tvo.textRangeFromPosition_toPosition_(p1,p2)
                                          b_del.action = b_del_action
                                          v.add_subview(b_del)
                                          
                                          1 Reply Last reply Reply Quote 0
                                          • cvp
                                            cvp @shinya.ta last edited by

                                            @shinya.ta clear

                                            b_clear = ui.Button()
                                            b_clear.frame = (10,290,100,32)
                                            b_clear.title = 'clear'
                                            b_clear.background_color = 'white'
                                            b_clear.border_width = 1
                                            def b_clear_action(sender):
                                                tv = sender.superview['TextView']
                                                tv.text = ''
                                            b_clear.action = b_clear_action
                                            v.add_subview(b_clear)
                                            
                                            shinya.ta 3 Replies Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Powered by NodeBB Forums | Contributors