我发现Python 3.5中经典和ttk小部件之间的Entry小部件验证存在意想不到的差异。
使用经典小部件:
from tkinter import *
def validate(reason):
print("--> validate:", reason)
return(True)
def change():
var.set("data")
root = Tk()
vc = root.register(validate)
var = StringVar()
Entry(root, textvariable = var, validate = "all", validatecommand = (vc, "%V")).pack()
Button(root, text = "Change", command = change).pack()
root.mainloop()
使用ttk小部件:
from tkinter import *
from tkinter.ttk import *
... same code as above
使用经典小部件时,按下“更改”按钮时,将使用reason ==“forced”调用validate函数,这似乎符合Tk doc。使用ttk小部件时,按下“更改”按钮时,不会调用验证功能。否则,验证函数似乎具有两种情况的等效行为。任何人都知道这是一个错误还是一个功能?
答案 0 :(得分:1)
这是一个功能。根据{{3}}:
传统知识进入WIDGET验证的差异
标准的Tk条目小部件会自动禁用验证(通过 如果-validatecommand或-invalidcommand,则设置-validate为none 修改条目的值。 Tk主题条目小部件仅禁用 验证其中一个验证脚本是否引发错误,或者是否 -validatecommand不返回有效的布尔值。 (因此,在修改条目值后无需重新启用验证 在验证脚本中。)
此外,标准条目小部件每当调用时都会调用验证 链接-text变量被修改; Tk主题条目小部件没有。