无法重用分配给 tkinter.PhotoImage 的变量
Can't reuse variable assigned with tkinter.PhotoImage
我试图遍历一个字典,其中包含我想添加到 tkinter 菜单对象的图标的名称。这是代码片段:
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
的名称更改为 imgvar1
、imgvar2
等名称),则会添加图标。但是,每次我尝试这个循环时,它总是在 imgvar
的第二次赋值时死掉。我试过删除它,设置为 null - 我所做的一切都不起作用。
现在,如果我删除图像命令,菜单将填充我字典中所有 38 个硬币的名称。我已经验证循环正在选择正确的图标 name/location。
这是因为你使用了同一个变量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
我试图遍历一个字典,其中包含我想添加到 tkinter 菜单对象的图标的名称。这是代码片段:
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
的名称更改为 imgvar1
、imgvar2
等名称),则会添加图标。但是,每次我尝试这个循环时,它总是在 imgvar
的第二次赋值时死掉。我试过删除它,设置为 null - 我所做的一切都不起作用。
现在,如果我删除图像命令,菜单将填充我字典中所有 38 个硬币的名称。我已经验证循环正在选择正确的图标 name/location。
这是因为你使用了同一个变量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