Tkinter 条目验证

0 tkinter python-3.x tkinter-entry

我正在使用 Tkinter 在 Python 3.6 中编写程序,其中客户有多个(11)个输入字段。我希望这些输入字段只接受整数,并且还能够定义最大字符数。

我已经有一个功能可以做到这一点。但此功能仅适用于一个输入字段。我尝试通过调用函数来输入变量,因此它会更改另一个输入字段。我无法做到这一点。

这是我的功能,适用于 1 个输入字段。

    def limitMuntgeld(self, *args):
        value = self.invoerM.get()
        if len(value) > 5:
            self.invoerM.set(value[:5])
        if value.lower() in "abcdefghijklmnopqrstuvwxyz-=[];/":
            self.invoerM.set(value[:0])
Run Code Online (Sandbox Code Playgroud)

这是与函数一起使用的示例输入字段代码

self.invoerMuntgeld = Entry(self, font=('Arial', 14), textvariable=self.invoerM)
Run Code Online (Sandbox Code Playgroud)

这与下面发布的输入字段上的跟踪相结合。

self.invoerM = StringVar()
self.invoerM.trace('w', self.limitMuntgeld)
Run Code Online (Sandbox Code Playgroud)

我也用 vcmd 和 validatecommand 尝试过。然而,没有好的结果。我的最终结果将是一个处理所有输入字段的函数。如果有人有任何建议,我会全神贯注!

Bry*_*ley 5

进行条目验证的正确方法是使用validatecommand选项而不是使用trace. 使用小部件内置的验证功能,您不需要对小部件本身的引用(尽管您可以根据需要使用它)。

validatecommand运行时,你可以把它传递将是什么新的值,如果输入的是有效的。您只需要检查这个值然后返回Trueor False,而不必知道它适用于哪个小部件。

例如:

import tkinter as tk

def validate_input(new_value):
    valid = new_value .isdigit() and len(new_value) <= 5
    return valid

root = tk.Tk()

validate = root.register(validate_input)
for i in range(10):
    entry = tk.Entry(root, validate="key", validatecommand=(validate, "%P"))
    entry.pack(side="top", fill="x")

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

有关什么%P代表以及还有什么可以用作命令参数的信息,请参阅此问题:交互式验证 tkinter 中的条目小部件内容