【问题标题】:Tkinter: Buttons made with a loop having different commands all produce the same result [duplicate]Tkinter:使用具有不同命令的循环制作的按钮都会产生相同的结果[重复]
【发布时间】:2018-12-15 07:19:14
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 但用户可以拥有任意数量的文件。我怎么知道我必须制作多少物品?
    • 您可以创建一个字典,其中键是 doc1、doc2 等字符串,并使用迭代器输入数字。您的值将是 Button 对象,您将能够通过字典的键调用每个对象。稍后我将在答案中编辑并发布示例代码。
    • 我试过了,但是没用。
    • 你试过stackoverflow.com/questions/39174661/…提供的链接吗?
    • 我现在有了,它完美无缺。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 那仍然没有解决问题:(
    猜你喜欢
    • 2020-04-13
    • 2022-01-23
    • 2021-04-25
    • 2019-06-16
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2017-04-29
    相关资源
    最近更新 更多