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
-
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?
-
@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')
-
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!
-
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?
-
@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
-
@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()
-
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.
-
Please tell me again if we can't tell you.
-
@shinya.ta Sorry, I didn't understand your last post, I have to say that English is not my mother language too π
-
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') -
@cvp
Please tell me again when it is difficult.
I'm sorry. -
@shinya.ta Little errors in clear def
I don't have your .pyui file, thus tried thisimport 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')
-
-
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?
-
-
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_yb_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') -
@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 </> -
@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? -
@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)
-
@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)