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