Tkinter .icursor(*arg) 奇怪的行为

Tkinter .icursor(*arg) strange behaviour

我想用 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))。

如果需要更多代码,我会更新 post。

感谢您的宝贵时间和帮助!

问题是您正在设置光标,但随后底层小部件以正常方式设置光标。因为您在 Tkinter 处理按键和释放过程中将字符插入到小部件中,所以它会变得混乱。例如,在第一次击键时,它认为光标应该在位置 1,但是您在该位置之后插入了一个字符,因此光标在字符之间结束。

最简单的解决方案是使用 after_idle:

将更改安排在默认行为之后发生
Body.after_idle(self.InsertTelephoneNumber.icursor, len(Plain))