我创建了一个python类,它从tkinter库继承Tk。 我想添加一个带有图像的标签,但它只在我创建一个Photoimage作为“self”的变量时起作用。你知道吗
此代码适用于:
class HMIDrawer(Tk):
def __init__(self):
super().__init__()
self.frame = Frame(self)
self.img = PhotoImage(file='resources/platoontomtom_empty.png')
self.label = Label(self.frame, image=self.img, bg='white')
self.label.pack()
self.frame.pack()
self.mainloop()
这个代码不起作用:
class HMIDrawer(Tk):
def __init__(self):
super().__init__()
self.frame = Frame(self)
img = PhotoImage(file='resources/platoontomtom_empty.png')
self.label = Label(self.frame, image=img, bg='white')
self.label.pack()
self.frame.pack()
self.mainloop()
有人能解释为什么第一个代码能工作而第二个代码不能工作吗?你知道吗
PhotoImage
从文件中读取图像数据,并将其作为像素缓冲区存储在内存中。只要应用程序运行(或者至少只要显示图像的Label小部件存在),这个缓冲区的引用就必须是持久的。你知道吗如果将PhotoImage的结果放在局部变量中(例如
img
,如第二个代码中),垃圾收集器很可能会破坏该局部变量引用的数据。另一方面,如果将像素缓冲区的引用存储在一个属性中(例如self.img
,如在第一个代码中),只要self
存在,垃圾收集器就不会销毁数据,这意味着只要应用程序运行。。。你知道吗如果您的GUI使用许多图像,通常的做法是创建一个属性
self.images
,将所有需要的图像放在元组或字典中(无论您喜欢用数字还是字符串对它们进行索引),以确保所有图像都保存在内存中。你知道吗相关问题 更多 >
编程相关推荐