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

时间:2012-03-31 20:06:22

标签: python validation tkinter tk

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

但是,插入此值后,所有验证都会显示在窗口外,并且Entry允许使用大写值。对我的程序进行的一些测试显示,在条目的任何其他事件(键,焦点/输出等)上没有调用验证命令(在这种情况下为OnValidate)。

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

我这样做的原因是我希望Entry在用户进行任何更改后保留其值时显示默认值。 (即我的条件是焦点if not P

如何实现这一点或上面出现的问题的任何想法都非常赞赏。

2 个答案:

答案 0 :(得分:3)

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

根据official tk documentation on entry validation

  

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

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

答案 1 :(得分:2)

我将基于以下内容完全回答:

  

我这样做的原因是我希望Entry显示默认值   如果值在由a生成的任何更改后保留为空,则为value   用户。

并希望此示例指出您想要的内容:

import Tkinter as tk

def analyze(event=None):
    content = entry_contents.get()
    if content == "":
        entry_contents.set("default")

lord = tk.Tk()

entry_contents = tk.StringVar()
aEntry = tk.Entry(lord, textvariable=entry_contents)
aEntry.grid()

aText = tk.Text(lord, font=("Georgia", "12"))
aText.grid()

aEntry.bind("<FocusOut>", analyze)

lord.mainloop()

control variable对您没有任何用处:

import Tkinter as tk

def analyze(event=None):
    content = aEntry.get()
    if content == "":
        aEntry.insert(0, "default")

lord = tk.Tk()

aEntry = tk.Entry(lord)
aEntry.grid()

aText = tk.Text(lord, font=("Arial", "12", "bold"))
aText.grid()

aEntry.bind("<FocusOut>", analyze)

lord.mainloop()