Tkinter中的匿名函数-Python

如何解决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只能跟踪按钮之间的一个匿名功能。这是正确的吗?

这就是我认为的原因:

  • 无论情况如何,无论最后一个匿名函数如何 被分配的位置将成为每个按钮的绑定命令。
    • 如果有三个按钮,则会出现第三个文件对话框 对于所有的人。
    • 如果我反转第二个for循环的方向 __init__,即显示的CSV文件对话框。只有我 在列表中的列表中显式定义lambda函数 我曾经能够使用__init__方法来使它们起作用。

但是,发生了一些与我的理论相抵触的事情,这让我非常困惑:

  • 如果这些lambda函数是在循环中定义的,即使是在单独的循环中,也会发生此问题。如果明确定义了它们,那么一切都会按预期进行,问题消失了。

我希望我只是有一些逻辑错误,而且我的怀疑是不正确的,因为如果tkinter无法跟踪哪个按钮具有哪个命令,它将很糟糕。感谢您的帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?