如何生成具有不同图像的按钮

时间:2018-12-25 00:11:15

标签: python tkinter python-imaging-library

所以我正在用tkinter和PIL用python写基本的东西,这里的问题是当我运行程序时,只有最后一个按钮显示了我要求他显示的项目的图像。

因此,我的程序应从txt文档中包含游戏冠军名称的行中提取项目名称。 文档中的每一行看起来都像“ ItemName/stat1/stat2/stat3/ChampionName”。

然后该代码应该创建带有项目图片的按钮(我确保将png和.txt中的项目名称命名为相同,并将所有内容放置在同一文件夹中),但最后,只有最后一个按钮上有图像。

我尝试过的:

  • 我试图减少txt中的元素数量,但这没用
  • 然后我认为问题在于变量图标正在更新,显示的图像会消失。因此,我尝试制作一个数组,但由于我输入的不是int值而无法正常工作,我知道它与“ i”有关,但我不知道是否可以放入其他合适的东西。

我的第一次尝试:

from PIL import Image, ImageTk 
import tkinter as tk

itemwindo = tk.Tk()
itemwindo.title("Items")

data = open("Ressource.txt","r")
for line in data:
    if 'Vi' in line:
        (a,b,c,d,e) = line.split("/")
        icon = ImageTk.PhotoImage(Image.open(a + '.png'))
        bt = tk.Button(itemwindo,image=icon)
        bt.pack()
itemwindo.mainloop()

第二个是数组:

data = open("Ressource.txt","r")
imglist = arr.array('i')
for line in data:
    if 'Vi' in line:
        (a,b,c,d,e) = line.split("/")
        icon = ImageTk.PhotoImage(Image.open(a + '.png'))
        imglist.extend([icon])
        p = len(imglist)
        bt = tk.Button(itemwindo,image=imglist[p])
        bt.pack()
itemwindo.mainloop()

我希望每个按钮都能在其上显示附属项目的图片。

1 个答案:

答案 0 :(得分:1)

在创建按钮的循环中,您使用相同的名称 每个图像。每次迭代都会创建一个新对象, 以前的按钮不再能找到对先前图像的引用。

要解决此问题,您可以分配按钮的image属性 在创建时,如果重用iconbt名称,则不再有任何区别。研究以下示例:

import tkinter as tk

itemwindo = tk.Tk()

file_list = ['beer.png', 'test.gif']
for file in file_list:
    icon = tk.PhotoImage(file=file)
    bt = tk.Button(itemwindo, image=icon)
    bt.pack()
    bt.image = icon # Save reference to icon in button

itemwindo.mainloop()