Tkinter:使用具有不同命令的循环制作的按钮都会产生相同的结果

Tkinter: Buttons made with a loop having different commands all produce the same result

我使用 Tkinter 和 SQLite3 在 Python3 中制作了一个文本文件管理系统。每个用户的文件都存储在数据库中。在用户登录后的主屏幕上,for 循环遍历文件名并为每个文件创建一个按钮。每个按钮都必须打开与其名称对应的文件。

问题是,所有按钮打开最后一个按钮对应的文件,而不是它们对应的文件名。

为了更清楚,这是我的代码:

for i in viewdata:
        doc=Button( mainframe, image=docimg, bd=0,cursor='hand1',  command=lambda: openexistingfile(str(i[0])))
        doc.place(x=cnt, y=70)
        doc.image=docimg
        Label(mainframe, text=str(i[0]), font='Times 12 italic', bg='white').place(x=cnt, y=130)
        cnt+=120
        print(str(i[0]))

假设用户有3个文件,sample1、sample2和sample3。所以在这里,viewdata = [(sample1, ), (sample2,), (sample3,)]。现在,将创建三个按钮,每个按钮打开一个文件。但是,由于某种原因,所有按钮都打开了 sample3。

最后一个 print 语句以正确的格式正确地打印了文件名,这只是我遇到问题的 Button 命令。

如有任何帮助,我们将不胜感激。谢谢你。

您应该创建 3 个不同的 Button 对象。
目前,您的代码正在使用 doc 名称中的最新对象覆盖先前的对象分配。

根据 YCX 的回答,您可以对按钮执行此操作:

for index, i in enumerate(viewdata):
    vars()['doc'+str(index)]=Button( mainframe, image=docimg, bd=0,cursor='hand1',  command=lambda: openexistingfile(str(i[0])))
    vars()['doc'+str(index)].place(x=cnt, y=70)
    vars()['doc'+str(index)].image=docimg