Python tkinter Entry widget validation error : TypeError: 'str' object is not callable
Python tkinter Entry widget validation error : TypeError: 'str' object is not callable
我正在尝试使用 Tkinter 的条目小部件的内置输入验证,但我无法弄清楚为什么在触发条目验证时我会收到 TypeError。 (不管什么样的事件触发验证)。在下面的简单代码中,我试图仅验证用户的数字输入。字母字符必须禁用应用按钮。但是只要你输入任何字符,就会出现“TypeError: 'str' object is not callable”。有什么想法吗?!
from tkinter import *
from tkinter import ttk
root = Tk()
entry_string = StringVar()
entry_field = ttk.Entry(root, textvariable=entry_string, validate='key')
apply_button = ttk.Button(root, text='Apply', state='normal')
entry_field.grid(column = 0 , row = 0)
apply_button.grid(column = 0 , row = 1)
def validate(entry):
if str(entry).isnumeric():
apply_button.config(state = 'normal')
return TRUE
else:
return FALSE
def on_invalid():
apply_button.config(state='disabled')
vcmd = (root.register(validate(entry_string), '%P'))
ivcmd = (root.register(on_invalid()),)
entry_field.config(validatecommand=vcmd, invalidcommand=ivcmd)
root.mainloop()
问题
- validatecommand 参数的格式应为
(register(f), s1, s2, ...)
。您目前是 (register(f, s1, s2, ...))
.
- 您正在将
validate
函数的返回值传递给 register
,而您需要传递函数本身。
参考
我强烈建议您从文档中阅读此页
修复
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
entry_string = tk.StringVar()
entry_field = ttk.Entry(root, textvariable=entry_string, validate='key')
apply_button = ttk.Button(root, text='Apply', state='normal')
entry_field.grid(column = 0 , row = 0)
apply_button.grid(column = 0 , row = 1)
def validate(value):
if str(value).isnumeric():
apply_button.config(state = 'normal')
return tk.TRUE
else:
return tk.FALSE
def on_invalid():
apply_button.config(state='disabled')
vcmd = (root.register(validate), '%P')
ivcmd = (root.register(on_invalid),)
entry_field.config(validatecommand=vcmd, invalidcommand=ivcmd)
root.mainloop()
我正在尝试使用 Tkinter 的条目小部件的内置输入验证,但我无法弄清楚为什么在触发条目验证时我会收到 TypeError。 (不管什么样的事件触发验证)。在下面的简单代码中,我试图仅验证用户的数字输入。字母字符必须禁用应用按钮。但是只要你输入任何字符,就会出现“TypeError: 'str' object is not callable”。有什么想法吗?!
from tkinter import *
from tkinter import ttk
root = Tk()
entry_string = StringVar()
entry_field = ttk.Entry(root, textvariable=entry_string, validate='key')
apply_button = ttk.Button(root, text='Apply', state='normal')
entry_field.grid(column = 0 , row = 0)
apply_button.grid(column = 0 , row = 1)
def validate(entry):
if str(entry).isnumeric():
apply_button.config(state = 'normal')
return TRUE
else:
return FALSE
def on_invalid():
apply_button.config(state='disabled')
vcmd = (root.register(validate(entry_string), '%P'))
ivcmd = (root.register(on_invalid()),)
entry_field.config(validatecommand=vcmd, invalidcommand=ivcmd)
root.mainloop()
问题
- validatecommand 参数的格式应为
(register(f), s1, s2, ...)
。您目前是(register(f, s1, s2, ...))
. - 您正在将
validate
函数的返回值传递给register
,而您需要传递函数本身。
参考
我强烈建议您从文档中阅读此页
修复
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
entry_string = tk.StringVar()
entry_field = ttk.Entry(root, textvariable=entry_string, validate='key')
apply_button = ttk.Button(root, text='Apply', state='normal')
entry_field.grid(column = 0 , row = 0)
apply_button.grid(column = 0 , row = 1)
def validate(value):
if str(value).isnumeric():
apply_button.config(state = 'normal')
return tk.TRUE
else:
return tk.FALSE
def on_invalid():
apply_button.config(state='disabled')
vcmd = (root.register(validate), '%P')
ivcmd = (root.register(on_invalid),)
entry_field.config(validatecommand=vcmd, invalidcommand=ivcmd)
root.mainloop()