我试图在脚本中使用Spinbox小部件,我希望Spinbox不接受错误的输入。我希望输入是0到50之间的整数。我发现我可以使用选项validatecommand
来调用已注册的函数来检查输入,并使用选项invalidcommand
来做东西,如果validatecommand
调用的函数返回False
。所以我想要的是:
这是我设置Spinbox的代码:
import tkinter as tk
root = tk.Tk()
validate_input = (root.register(correct_input), '%P')
invalid_input = (root.register(incorrect_input), '%W')
x_select = tk.Spinbox(root, from_ = 0, to = 50,
validate = 'all', validatecommand = validate_input,
invalidcommand = invalid_input)
x_select.grid(row = 1, column = 0, columnspan = 2)
以下是用于控制输入并在必要时将其更改回默认值的函数:
def correct_input(text):
valid = False
if text.isdigit():
if (int(text) <= 50 and int(text) >= 0):
valid = True
elif text == '':
valid = True
return valid
def incorrect_input(widget_name):
widget = root.nametowidget(widget_name)
widget.delete(0, 'end')
widget.insert(0, 0)
问题是,它只能运作一次:如果我输入&#39; a&#39;例如x_select
中的值将被设置为0
,但不再检查输入,即我可以键入任何我想要的输入将不会被纠正。我在这里做错了什么?
答案 0 :(得分:1)
检查some documentation后我发现使用invalidcommand
是不必要的,因为
回调函数检查Entry中的文本,如果文本有效则返回True,否则返回False。如果回调返回False,则用户尝试编辑文本将被拒绝,文本将保持不变。
此处我的回调函数为correct_input
:如果它返回False
,则不会更改文本。所以没有:
x_select = tk.Spinbox(root, from_ = 0, to = 50,
validate = 'all', validatecommand = validate_input,
invalidcommand = invalid_input)
我写道:
x_select = tk.Spinbox(root, from_ = 0, to = 50,
validate = 'all', validatecommand = validate_input)
我删除了与incorrect_input
相关的任何行。