我一直在关注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
)
如何实现这一点或上面出现的问题的任何想法都非常赞赏。
答案 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()