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

时间:2016-08-28 17:09:36

标签: python python-2.7 function tkinter cursor

我想创建一个带有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))。

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

感谢您的时间和帮助!

1 个答案:

答案 0 :(得分:2)

问题在于您正在设置光标,但是底层窗口小部件按照通常的方式设置光标。因为你在Tkinter处理按键和释放的过程中将字符插入到小部件中,所以会让人感到困惑。例如,在第一次击键时,它认为光标应该位于位置1,但是您在该位置之后插入了一个字符,因此光标在字符之间结束。

最简单的解决方案是使用after_idle安排在默认行为之后进行更改:

Body.after_idle(self.InsertTelephoneNumber.icursor, len(Plain))