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

时间:2018-12-15 07:19:14

标签: python python-3.x tkinter tkinter-entry

我使用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。

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

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:0)

您应该创建3个不同的private void button2_Click(object sender, EventArgs e) { string[] data = File.ReadAllLines(referenceFile); MessageBox.Show(string.Join(Environment.NewLine, data), "Your CSV"); } 对象。
当前,您的代码正在用Button名称中的最新代码覆盖先前的对象分配。

答案 1 :(得分:0)

根据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