如何解决Tkinter中的匿名函数-Python
我使用tkinter已有一段时间了,遇到了一个奇怪的问题。我有一个未完成的类,称为Submit,请参见其文档字符串以获取简短说明。
from tkinter import filedialog
import tkinter as tk
class Submit:
'''Make a simple Tk window with labels and buttons. The first entry of "labels" must be
the title,and the rest are labels for the files you'll ask from the user. If
len(labels) - 1 != len(buttons),then an error is thrown. Each button will record a file
name in self.files. Labels is a list of strings,and buttons is a list of tuples,with
one tuple for each button. The tuple consists of four strings: button title,file dialog
window title,file type descriptor,and file extension.
Ex: ("Pick TXT","Pick the text file","Text File",".txt")'''
def __init__(self,title,labels,buttons):
if len(labels) - 1 != len(buttons):
raise Exception("Incorrect 'labels' length with respect to 'buttons' length")
self.files = ["" for x in range(len(buttons))]
self.root = tk.Tk()
self.root.title(title)
# place labels
for i in range(len(labels)):
font = ('Arial',12)
if not i:
font = ('Arial Bold',16)
tk.Label(self.root,text=labels[i],font=font).grid(row=i,column=0)
# set up buttons
for i in range(len(buttons)):
tk.Button(self.root,text=buttons[i][0],width=10,command=lambda : self.button(buttons[i][1],buttons[i][2],buttons[i][3],i)).grid(row=i+1,column=1)
tk.mainloop()
def button(self,filedesc,fileext,index):
self.files[index] = filedialog.askopenfilename(title=title,filetypes=[(filedesc,fileext)])
现在,如果我像下面的代码片段那样运行代码,则程序行为中会出现意外错误。所有按钮都将其命令更改为给定的最后一个lambda
函数。
labels = ["Linear Algebra Auto-Grader","Select Student Analysis Report CSV","Select Quiz Answers JSON"]
buttons = [("Select CSV","Student Analysis Report CSV","CSV Documents",".csv"),("Select JSON","Quiz Answers","JSON Files",".json")]
window = Submit("Linear Algebra Auto-Grader",buttons)
因此,如果您将以上两个代码段组合在一起,那么出问题的是,我单击了“选择CSV”按钮,但是出现的文件对话框中包含一个窗口标题,文件类型描述符和文件扩展名。 “选择JSON”按钮。 “选择JSON”文件对话框窗口具有正确的方面。通常,最后一个按钮的文件对话框方面就是每个按钮的方面。
我的怀疑是:tkinter只能跟踪按钮之间的一个匿名功能。这是正确的吗?
这就是我认为的原因:
但是,发生了一些与我的理论相抵触的事情,这让我非常困惑:
- 如果这些lambda函数是在循环中定义的,即使是在单独的循环中,也会发生此问题。如果明确定义了它们,那么一切都会按预期进行,问题消失了。
我希望我只是有一些逻辑错误,而且我的怀疑是不正确的,因为如果tkinter无法跟踪哪个按钮具有哪个命令,它将很糟糕。感谢您的帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。