在条目验证期间,Python/Tkinter奇怪地插入而不是替换

2024-09-29 23:16:49 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个简单的Python/Tkinter程序,带有单条目小部件,我想自动检查是否输入了数字。在

from Tkinter import *

class MyClass:
    def __init__(self, parent):
        self.myParent = parent
        self.portVar = IntVar()
        self.portVar.set(111)

        port_validator = self.myParent.register(self._validate)

        self.myEntry = Entry(self.myParent, width=9, textvariable=self.portVar,
            validate='all', validatecommand=(port_validator,'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W'))

        self.myEntry.pack(side=TOP)


    def _validate(self, d, i, P, s, S, v, V, W):
        print "OnValidate: d='%s' i='%s' P='%s' s='%s' S='%s' v='%s' V='%s' W='%s'" % (d, i, P, s, S, v, V, W)
        return P.isdigit()


root = Tk()
myclass = MyClass(root)
root.mainloop() 

只为调试而在\u validate()函数中打印语句。 问题是在这种情况下,条目的可视化编辑不正确。 例如,我执行以下步骤:

  1. 启动程序。在
  2. 请参见条目中的“111”值
  3. 用鼠标左键选择“111”
  4. 按键盘上的“9”
  5. 不是完全替换'111'到'9'插入,我看到'9111'!在

调试日志(为了方便起见,我计算了步骤):

  1. OnValidate:d='-1'i='-1'P='111's=''s=''v='all'v='forced'W='.37125736'
  2. OnValidate:d='-1'i='-1'P='111's='111's=''v='all'v='focusin'W='.37125736'
  3. OnValidate:d='0'i='0'P=''s='111's='111'v='all'v='key'W='.37125736'
  4. OnValidate:d='1'i='0'P='9111's='111's='9'v='all'v='key'W='.37125736'
  5. OnValidate:d='0'i='1'P='9's='9111's='111'v='all'v='key'W='.37125736'
  6. OnValidate:d='1'i='1'P='99's='9's='9'v='all'v='key'W='.37125736'
  7. OnValidate:d='1'i='2'P='999's='99's='9'v='all'v='key'W='.37125736'

注意步骤4。这是一个奇怪的附加步骤,带有不需要的输入文本状态('9111')

但如果我改变

^{pr2}$

^{3}$

一切都好起来了!条目的工作方式与其他程序中的任何条目类似。在

1. OnValidate: d='-1' i='-1' P='111' s='' S='' v='all' V='forced' W='.37650024'
2. OnValidate: d='-1' i='-1' P='111' s='111' S='' v='all' V='focusin' W='.37650024'
3. OnValidate: d='0' i='0' P='' s='111' S='111' v='all' V='key' W='.37650024'
4. OnValidate: d='1' i='0' P='9' s='' S='9' v='all' V='key' W='.37650024'
5. OnValidate: d='1' i='1' P='99' s='9' S='9' v='all' V='key' W='.37650024'
6. OnValidate: d='1' i='2' P='999' s='99' S='9' v='all' V='key' W='.37650024'

为什么,伙计们?在


Tags: keyself程序tkinterdefmyclass步骤条目
1条回答
网友
1楼 · 发布于 2024-09-29 23:16:49

{cd1>限制了你的内容。当您将111替换为9时,会有一个步骤,其中条目的内容是空字符串。由于''.isdigit()为false,小部件始终保留一个数字作为其内容。删除此约束允许任何字符串,然后可以完全替换该值。在

相关问题 更多 >

    热门问题