我有以下代码:
import tkinter as tk
data = [['A',1],['B',2],['C',3],['D',4]]
def ranking():
root = tk.Tk()
root.focus_force()
windowWidth = root.winfo_reqwidth()
windowHeight = root.winfo_reqheight()
positionRight = int(root.winfo_screenwidth()/2 - windowWidth/2)
positionDown = int(root.winfo_screenheight()/2 - windowHeight/2)
root.geometry("+{}+{}".format(positionRight, positionDown))
for i in range(0,len(data)):
tk.Label(image=tk.PhotoImage(file="D:\\A\\" + data[i][0] + ".gif")).grid(row=data[i][1]-1, column=0)
root.mainloop()
ranking()
我想做的是在窗口中显示随机数量的图片(无论何时将其插入数据中)(按数据中指示的顺序显示),但是如果我当前正在运行代码,只是导致一个空白窗口。图片的名称实际上是A,B,C ...,如果我使用类似的图片,它们的显示就没有问题(这是我编写的另一段代码的摘录):
img2 = tk.PhotoImage(file="D:\\A\\" + choice2 + ".gif")
label_img2 = tk.Label(image=img2)
label_img2.grid(row=2, column=1)
任何指导都将受到欢迎,因为我对使用tkinter还是很陌生的!
答案 0 :(得分:2)
将PhotoImage或其他Image对象添加到Tkinter小部件时,必须保留自己对image对象的引用。如果不这样做,图像将不会总是显示。
问题是Tkinter / Tk界面无法正确处理对Image对象的引用; Tk小部件将保留对内部对象的引用,但Tkinter不会。当Python的垃圾收集器丢弃Tkinter对象时,Tkinter告诉Tk释放图像。但是,由于小部件正在使用图片,因此Tk不会销毁它。不完全的。它只是使图像空白,使其完全透明...
解决方案是确保保留对Tkinter对象的引用,例如,将其附加到小部件属性:
for i in range(0,len(data)):
photo = tk.PhotoImage(file="D:\\A\\" + data[i][0] + ".gif")
label = tk.Label(image=photo )
label.image = photo # keep a reference!
label.grid(row=data[i][1]-1, column=0)