Python tkinter:Spinbox、validatecommand和invalidcommand

Python tkinter:Spinbox、validatecommand和invalidcommand,python,tkinter,user-input,Python,Tkinter,User Input,我试图在脚本中使用Spinbox小部件,我希望Spinbox不接受不正确的输入。我希望输入是一个介于0和50之间的整数。我发现我可以使用选项validatecommand调用已注册函数来检查输入,如果validatecommand调用的函数返回False,则可以使用选项invalidcommand执行操作。所以我想要的是: 检查输入是否正确 如果不是,请将Spinbox中的值更改为默认值(例如0) 以下是我设置Spinbox的代码: import tkinter as tk root =

我试图在脚本中使用Spinbox小部件,我希望Spinbox不接受不正确的输入。我希望输入是一个介于0和50之间的整数。我发现我可以使用选项
validatecommand
调用已注册函数来检查输入,如果
validatecommand
调用的函数返回
False
,则可以使用选项
invalidcommand
执行操作。所以我想要的是:

  • 检查输入是否正确
  • 如果不是,请将Spinbox中的值更改为默认值(例如0)
以下是我设置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)
def correct_输入(文本):
有效=错误
如果text.isdigit():
如果(int(text)=0):
有效=真
elif文本=='':
有效=真
返回有效
def输入不正确(小部件名称):
widget=root.nametWidget(widget\u name)
widget.delete(0,“结束”)
widget.insert(0,0)
问题是,它只工作一次:例如,如果我键入“a”,则
x_select
中的值将设置为
0
,但随后不再检查输入,即我可以键入任何我想要的内容,输入将不会被更正。我做错了什么?

检查后,我发现使用
invalid命令是不必要的,因为

回调函数检查条目中的文本,如果文本有效,则返回True,否则返回False。如果回调返回False,用户编辑文本的尝试将被拒绝,文本将保持不变

这里我的回调函数是
correct\u 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)

我删除了所有与输入错误相关的行clear@ADWAN什么是不清楚的?我最终希望用户不能键入我描述的不需要的值(任何不是数字的值,以及任何不在0和50之间的数字)。为此,我使用
Spinbox
选项
validatecommand
,该选项将在触发时调用函数(触发器由
validate
选项设置)。该函数是
correct\u input
,如果输入正常,则返回
True
,否则返回
False
。如果由
validatecommand
调用的函数返回
False
,则
invalidcommand
调用一个函数以避免输入不正确(该函数是
输入不正确
)。