【问题标题】:Can't reuse variable assigned with tkinter.PhotoImage无法重用 tkinter.PhotoImage 分配的变量
【发布时间】:2020-11-27 05:13:08
【问题描述】:

我正在尝试遍历包含要添加到 tkinter Menu 对象的图标名称的字典。这是代码的sn-p:

token_menu = Menu(menubar, tearoff=0)
menubar.add_cascade(label="Tokens",
                    underline=0,
                    menu=token_menu)
for coin in cbp_symbols.keys():
    imgvar = PhotoImage(file=f"icons/{cbp_symbols[coin]['icon']}")
    token_menu.add_command(label=f"{coin} ({cbp_symbols[coin]['name']})",
                           image=imgvar,
                           compound=LEFT,
                           command=quit)
win.config(menu=menubar)

我遇到的问题是imgvar 变量的重用。例如,如果我运行一次循环,则会添加图标。如果我删除循环并分别添加每个菜单项(并将imgvar 的名称更改为imgvar1imgvar2 等),则会添加图标。但是,每次我尝试这个循环时,它总是在imgvar 的第二次分配中死掉。我试过删除它,设置为 null - 我没有做任何工作。

现在,如果我删除图像命令,菜单会填充我字典中所有 38 个硬币的名称。我已验证循环选择了正确的图标名称/位置。

【问题讨论】:

  • 希望如此。当我按照发布的方式运行循环时,我没有收到任何图像或新的菜单条目 - 没有报告错误,什么也没有。我会尝试查看您的链接中使用的逻辑。
  • 在链接中它谈到了将图标分配给不同的 Button 对象。除了添加新菜单项之外,我找不到任何有关如何编辑单个菜单项的文档。
  • 解决方案的要点是保存图片的引用。对于您的情况,请使用列表来存储图像。
  • 哇——真的奏效了!非常感谢!如果你想添加一个答案,我会投赞成票。

标签: python-3.x tkinter photoimage


【解决方案1】:

这是因为您使用相同的变量imgvar 来保存PhotoImage 实例的引用,所以只有最终图像具有对其的变量引用。然后其他图像将被垃圾收集。

对于您的情况,您可以使用列表来存储图像的引用:

imagelist = []
for coin in cbp_symbols.keys():
    imgvar = PhotoImage(file=f"icons/{cbp_symbols[coin]['icon']}")
    token_menu.add_command(label=f"{coin} ({cbp_symbols[coin]['name']})",
                           image=imgvar,
                           compound=LEFT,
                           command=quit)
    imagelist.append(imgvar) # save the reference of image

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 2020-09-01
    • 2022-11-26
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2022-12-25
    相关资源
    最近更新 更多