python-3.x - 如何将值传递给条目 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
.
是否可以将值传递给验证命令?
解决方案
该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"))
推荐阅读
- python-2.7 - Any alternative mock server which can migrate from postman example?
- javascript - how to deal with browser console error message of RESTful api request
- python - Dask + PostgreSQL read_sql_table:不正确的数据类型 index_col
- sql - ORA-01722: invalid number while executing select query
- rss - How to find the RSS url for a company
- deeplearning4j - How can I create a deeplearning4j Lambda Layer taking the mean over one dimension for a keras model inported from python?
- java - 如何创建算法以在 RecyclerView 中设置多检查项
- vue.js - VUE 中的 Axios 承诺失败,无法读取未定义的属性“toUpperCase”
- java - 如何在android中以编程方式更新样式属性值
- swift - 组合中的 Publisher 与 AnyPublisher