首页 > 解决方案 > 如何将值传递给条目 validatecommand

问题描述

我正在使用 tkinter 验证表单validatecommand。有两个条目,一个应该只接受整数,另一个应该接受浮点数。
这是基本代码:

import tkinter as tk
class Form(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        validCmd1 = (self.register(self.val1), "%P")
        validCmd2 = (self.register(self.val2), "%P")
        self.lab1 = tk.Label(self, text = "Float:")
        self.lab1.grid(row = 1, column = 0, padx = 10, pady = 10)
        self.ent1 = tk.Entry(self, validate = "key", validatecommand = validCmd1)
        self.ent1.grid(row = 1, column = 1)
        self.lab2 = tk.Label(self, text = "Integer:")
        self.lab2.grid(row = 2, column = 0, padx = 10, pady = (0,10))
        self.ent2 = tk.Entry(self, validate = "key", validatecommand = validCmd2)
        self.ent2.grid(row = 2, column = 1)
    def val1(self, value):
        try:
            float(value)
        except:
            return False
        else:
            return True
    def val2(self, value):
        try:
            int(value)
        except:
            return False
        else:
            return True
app = Form()
app.mainloop()

我没有为两个非常相似的任务编写两个不同的函数,而是尝试将一个整数传递给 validate 命令(1 表示浮点数,2 表示整数)。我尝试使用 lambdas 将值传递给验证函数,首先是在 self.register 部分:self.register(lambda: self.val1(1))但这给了TypeError: <lambda>() takes 0 positional arguments but 1 was given,第二次我尝试在 validatecommand 命令上使用 lambda:validatecommand = lambda: validCmd1(1)这给了TypeError: 'tuple' object is not callable.
是否可以将值传递给验证命令?

标签: python-3.xvalidationtkinter

解决方案


validatecommand选项接受一个可以有任何你想要的参数的元组。例如,如果你想传递一个整数,就这么简单:

validCmd1 = (self.register(self.val), 1, "%P")
validCmd2 = (self.register(self.val), 2, "%P")

def val(self, arg, value):
    print(f"val1 arg='{arg}' value='{value}'")
    ...

有时,如果将命令的注册与传入的值分开,会更容易理解validatecommand。例如:

vcmd = self.register(self.val)
...
self.ent1 = tk.Entry(..., validatecommand = (vcmd, 1, "%P"))
self.ent2 = tk.Entry(..., validatecommand = (vcmd, 2, "%P"))

推荐阅读