我编写了这段代码:
from tkinter import *
from PIL import ImageTk, Image
import sys
import getnew
class startUp:
def __init__(self, master):
master.title("Tag checker")
master.resizable(False, False)
img1 = ImageTk.PhotoImage(Image.open("images/ss.png"))
cercaImg = Label(master, image = img1)
cercaImg.bind("<Button-1>",clicka)
cercaImg.grid(row=0,column=0)
img2 = ImageTk.PhotoImage(Image.open("images/opz.png"))
opzioniImg = Label(master, image = img2)
opzioniImg.grid(row=0,column=1)
img3 = ImageTk.PhotoImage(Image.open("images/exit.png"))
esciImg = Label(master, image = img3)
esciImg.bind("<Button-1>",(master.destroy and quit))
esciImg.grid(row=0,column=2)
def clicka(event):
print('ciaooo')
x = getnew.getSchools()
print(x[0][0],x[0][1],x[0][2])
root = Tk()
st = startUp(root)
root.mainloop()
要点是要有3张图像,单击这些图像可以执行一个功能,但是这些图像没有显示。它们的确显示为大小和“可单击”区域,并执行该功能,但没有显示图像。
我在这里做什么错了?
答案 0 :(得分:1)
来自PhotoImage
上的tkinter docs:
您必须在Python程序中保留对图像对象的引用,方法是将其存储在全局变量中或将其附加到另一个对象。
这样做的原因是:
当PhotoImage对象被Python垃圾收集时(例如,当您从将图像存储在本地变量中的函数返回时),即使Tkinter小部件正在显示该图像,也会清除该图像。
strong>为避免这种情况,程序必须保留对图像对象的额外引用。一种简单的方法是将图像分配给小部件属性。
因此您的程序会出现:
img1 = ImageTk.PhotoImage(Image.open("images/ss.png"))
cercaImg = Label(master, image = img1)
cercaImg.image = img1 # Keep a reference
其他图像也是如此。