【发布时间】:2021-06-05 07:09:19
【问题描述】:
我一直在尝试通过附加一个处理函数在 Entry 小部件中进行一些类型检查,该处理函数同时提供了条目和预期类型(来自内置 type() 函数的 Type 类对象)。一切正常,除了 validatecommand 似乎将 Type 对象的类型从 Type 更改为字符串,这不是不可克服的,但让我很好奇发生了什么。
请参阅下面的最小可重现示例 - 请注意,处理程序在本机 python 中正确传递了类型对象,但使用 tkinter,类型对象的类型更改为字符串。
#NATIVE PYTHON
variable = 'HelloWorld'
vartype = type(variable)
print('VALUE OF VARTYPE: ', vartype, 'TYPE OF VARTYPE: ', type(vartype))
def handler(variable,vartype):
print('VALUE OF VARTYPE: ', vartype, 'TYPE OF VARTYPE: ', type(vartype))
handler(variable,vartype)
#TKINTER VALIDATE HANDLER
import tkinter as tk
top = tk.Tk()
frame = tk.Frame(top)
frame.pack()
vcmd =frame.register(handler)
entry = tk.Entry(frame, validate = 'focusout', validatecommand = (vcmd,"%P",vartype))
entry.pack()
top.mainloop()
解决这个问题的方法是为处理程序制作一个 lambda 包装器,以避免将类型对象传递给 validatecommand:
#NATIVE PYTHON
variable = 'HelloWorld'
vartype = type(variable)
print('VALUE OF VARTYPE: ', vartype, 'TYPE OF VARTYPE: ', type(vartype))
def handler(*variable,vartype=vartype):
print('VALUE OF VARTYPE: ', vartype, 'TYPE OF VARTYPE: ', type(vartype))
handler(*variable,vartype=vartype)
#TKINTER VALIDATE HANDLER
import tkinter as tk
top = tk.Tk()
frame = tk.Frame(top)
frame.pack()
vcmd =frame.register(lambda *args, vartype=vartype : handler(*args,vartype=vartype))
entry = tk.Entry(frame, validate = 'focusout', validatecommand = (vcmd,"%P"))
entry.pack()
top.mainloop()
但是,我仍然有些不满意,不知道第一次迭代发生了什么 - 我做错了什么?
【问题讨论】:
标签: python validation tkinter user-input tkinter-entry