将默认值插入 tkinter Entry 会停止验证

Jdo*_*dog 3 python validation tk-toolkit tkinter

我一直在关注此处对输入框的验证。下面的代码来自带有附加条件的答案,即如果输入的值是,'Q'则程序将添加'test'到 Entry 值的开头。

但是,一旦插入此值,所有验证似乎都将超出窗口,并且条目允许大写值。对我的程序进行的一些测试显示验证命令(OnValidate在本例中)不会在 Entry 的任何其他事件(键、焦点输入/输出等)上被调用。

import Tkinter as tk
class MyApp():
    def __init__(self):
        self.root = tk.Tk()
        vcmd = (self.root.register(self.OnValidate), 
                '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
        self.entry = tk.Entry(self.root, validate="key", 
                              validatecommand=vcmd)
        self.entry.pack()
        self.root.mainloop()

    def OnValidate(self, d, i, P, s, S, v, V, W):
        if S == "Q":
            self.entry.insert(0,"test")
        # only allow if the string is lowercase
        return (S.lower() == S)

app=MyApp()
Run Code Online (Sandbox Code Playgroud)

我这样做的原因是我希望 Entry 显示一个默认值,如果它的值在用户进行任何更改后保留为空。(即我的情况是if not P在焦点上)

任何想法如何实现这一点或上面出了什么问题,非常感谢。

Bry*_*ley 5

validatecommand选项仅用于验证,而不用于执行其他类型的操作。您看到的行为是记录在案的行为。

根据进入验证官方 tk 文档

... 当您从 validateCommand 或 invalidCommand 中编辑条目小部件时,validate 选项也会将自身设置为 none。

(注意:tkinter 只不过是 tk 的 tcl 实现的包装器。因此,tcl/tk 文档可以用作 Tkinter 行为的权威指南)