我想创建一个带有Tkinter的条目,用户可以在其中键入其电话号码,文本会动态更改,一旦完成就会变为+34 1234567890
。
在我的代码中,用于设置光标位置的函数.icursor(n)
起初不能正常工作,但是,它超过了前缀,它确实如此。
这是我的代码片段(它属于更大的代码片段)。
from Tkinter import *
def TelephoneCheck(self,Vari):
Plain = Vari.get()
Plain = list(Plain)
Plain_flat = []
for element in Plain:
try:
check = int(element)
Plain_flat.append(element)
except: pass
if len(Plain_flat) > 2:
Plain_flat.insert(2,' ')
Plain = ''.join(Plain_flat)
Plain = '+'+Plain
self.istn.set(Plain)
self.InsertTelephoneNumber.icursor(len(Plain))
def CreateInsertTelephoneNumber(self,X,Y,color='white'):
self.istn = StringVar()
self.istn.trace('w', lambda name, index, mode, istn=self.istn: self.TelephoneCheck(istn))
self.InsertTelephoneNumber = Entry(Body,textvariable=self.istn)
self.InsertTelephoneNumber.config(bg=color)
self.InsertTelephoneNumber.place(height=20,width=230,y=Y+27,x=X+245)
def LabelBody(self,X,Y):
TelephoneText = Label(Body,text='Telephone Number *')
TelephoneText.place(y=Y+4,x=X+243)
self.CreateInsertTelephoneNumber(X,Y)
如您所见,从理论上讲,每次用户添加数字时,都应在字符串的末尾设置位置。
我无法理解为什么它只在前缀后才起作用,而不是在输入第一个数字时(结果为+(Cursor here)3
而不是+3(Cursor here)
)。
如果需要更多代码,我会更新帖子。
感谢您的时间和帮助!
答案 0 :(得分:2)
问题在于您正在设置光标,但是底层窗口小部件按照通常的方式设置光标。因为你在Tkinter处理按键和释放的过程中将字符插入到小部件中,所以会让人感到困惑。例如,在第一次击键时,它认为光标应该位于位置1,但是您在该位置之后插入了一个字符,因此光标在字符之间结束。
最简单的解决方案是使用after_idle
安排在默认行为之后进行更改:
Body.after_idle(self.InsertTelephoneNumber.icursor, len(Plain))