如何在风中动态插入随机数目的图像

2024-04-20 14:17:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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的新手


Tags: 代码imagedatatkinterrootlabeltkint
1条回答
网友
1楼 · 发布于 2024-04-20 14:17:39

将PhotoImage或其他图像对象添加到Tkinter小部件时,必须保留自己对图像对象的引用。如果不这样做,图像不会总是显示出来

问题是Tkinter/Tk接口不能正确处理对图像对象的引用;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?

相关问题 更多 >