【问题标题】:Tkinter .icursor(*arg) strange behaviourTkinter .icursor(*arg) 奇怪的行为
【发布时间】:2017-01-04 17:59:17
【问题描述】:

我想使用 Tkinter 创建一个条目,用户可以在其中键入其电话号码,文本会动态更改,以便在完成后变成 +34 1234567890

在我的代码中,用于设置光标位置的函数.icursor(n),起初不能正常工作,但后来超过了前缀,它确实可以。

这是我的代码 sn-p(它属于更大的一个)。

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))。

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

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

【问题讨论】:

  • “不能正常工作”没有意义。你得到了什么,没有得到什么?
  • @ParvizKarimli .icursor(position) 应该将光标移动到指定位置。可悲的是,键入第一个字符时不会。所以我会说这是一种“无法正常工作”的行为......
  • 你做了什么来调试这个?您是否打印了变量的值以验证您的假设?
  • @BryanOakley 我做到了。每次将字符添加到字符串时,我都会打印整个列表及其长度。我什至在 if 块和 try-except 中添加了一个 print 以查看是否有问题,但一切似乎都正常。
  • @ParvizKarimli 你有。感谢您的建议。 pastebin.com/CCRsfuSm

标签: python python-2.7 function tkinter cursor


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多