如何在窗口中动态插入随机数量的图像

时间:2019-12-01 09:18:08

标签: python image tkinter

我有以下代码:

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还是很陌生的!

1 个答案:

答案 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)

取自Why do my Tkinter images not appear?