python - 试图让 validate 命令与多个输入一起工作
问题描述
我对 Tkinter 的 validatecommands 完全不熟悉,但我已经做了一些研究,并希望在一个从一堆条目创建树形图的小部件中实现它。我想限制每个条目,以便用户可以创建从 0 到最高行的数字列表,不包括同一行。因此,例如,第 0 行条目中不能有 0 或 12。到目前为止,我只尝试限制输入与行的值相同,但我无法让它工作。我一定是错误地执行了验证命令。
任何帮助将非常感激。
import tkinter as tk
class widget:
def __init__(self,master):
# vcmd = (master.register(self.validate),
# '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
self.master = master
self.entryNumbers = tk.Entry(master,justify = tk.CENTER)
self.entryNumbers.insert(0, "5")
self.entryNumbers.grid(row = 0,column = 0,columnspan =2,sticky="EW")
self.createEntriesButton = tk.Button(master,text = "Create Entries",command = self.createEntries)
self.createEntriesButton.grid(row = 1, column = 0,columnspan = 2,sticky="EW")
def createEntries(self):
self.entryNumbers.grid_forget()
self.createEntriesButton.grid_forget()
self.entries = []
self.entryLabels = []
vcmd = self.master.register(self.validateEntry)
for i in range(int(self.entryNumbers.get())):
self.entryLabels.append(tk.Label(self.master,text = "Row {}".format(i)))
self.entryLabels[-1].grid(row = i,column = 0)
self.entries.append(tk.Entry(self.master, validatecommand=(vcmd,'%P',i)))
self.entries[-1].grid(row = i,column = 1)
self.addEntriesButton = tk.Button(self.master,text = "Add Entries",command = self.addEntry)
self.addEntriesButton.grid(row = i+1, column = 0,columnspan = 2,sticky="EW")
def addEntry(self):
count = len(self.entries)
vcmd = self.master.register(self.validateEntry)
self.entryLabels.append(tk.Label(self.master,text = "Row {}".format(count)))
self.entryLabels[-1].grid(row = count+1,column = 0)
self.entries.append(tk.Entry(self.master, validatecommand=(vcmd,'%P',count)))
self.entries[-1].grid(row = count+1,column = 1)
self.addEntriesButton.grid(row = count+2, column = 0,columnspan = 2,sticky="EW")
def validateEntry(self,P,row):
if P != row:
return True
else:
return False
root1=tk.Tk()
widget(root1)
root1.mainloop()
另外, vcmd 可以是成员变量吗?我只想初始化一次?
解决方案
我使用 lambda 函数解决了这个问题:
vcmd = lambda row:(self.master.register(self.validateEntry),'%P',row)
for i in range(int(self.entryNumbers.get())):
self.entryLabels.append(tk.Label(self.master,text = "Row {}".format(i)))
self.entryLabels[-1].grid(row = i,column = 0)
self.entries.append(tk.Entry(self.master, validate = "all", validatecommand=vcmd(i)))
推荐阅读
- reactjs - 如何在 React 中使用环境?
- php - 如何在 PHP 的一次搜索中包含多个选择框(下拉列表)
- javascript - 为 NWJS 桌面应用程序构建具有依赖项的 NodeJS 后端
- asp.net - How to get only few properties from related data in EF core?
- android - 与收到的相比,Android FCM 发送的通知总数要高得多
- python - 如何只计算字典中的单词,同时返回字典键名的计数
- bash - 在bash中为变量字符串赋值
- python - 安装osmnx时出错(必须指定GDAL API版本)问题
- javascript - 使用 html 画布在没有库的 JS 中使用鼠标单击剪切形状
- elasticsearch - 使用 ELK 在 grafana 中可视化 Nginx 日志