tkinter:Spinbox,validatecommand和invalidcommand

时间:2018-03-26 11:44:53

标签: python tkinter user-input

我试图在脚本中使用Spinbox小部件,我希望Spinbox不接受错误的输入。我希望输入是0到50之间的整数。我发现我可以使用选项validatecommand来调用已注册的函数来检查输入,并使用选项invalidcommand来做东西,如果validatecommand调用的函数返回False。所以我想要的是:

  • 检查输入是否正确
  • 如果不是,请将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)

问题是,它只能运作一次:如果我输入&#39; a&#39;例如x_select中的值将被设置为0,但不再检查输入,即我可以键入任何我想要的输入将不会被纠正。我在这里做错了什么?

1 个答案:

答案 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相关的任何行。