对于tkinter标签图像,为什么本地名称和PhotoImage对象不起作用?

2024-09-30 03:22:49 发布

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

我创建了一个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()

有人能解释为什么第一个代码能工作而第二个代码不能工作吗?你知道吗


Tags: 代码selfimginitdefframelabelpack
1条回答
网友
1楼 · 发布于 2024-09-30 03:22:49

PhotoImage从文件中读取图像数据,并将其作为像素缓冲区存储在内存中。只要应用程序运行(或者至少只要显示图像的Label小部件存在),这个缓冲区的引用就必须是持久的。你知道吗

如果将PhotoImage的结果放在局部变量中(例如img,如第二个代码中),垃圾收集器很可能会破坏该局部变量引用的数据。另一方面,如果将像素缓冲区的引用存储在一个属性中(例如self.img,如在第一个代码中),只要self存在,垃圾收集器就不会销毁数据,这意味着只要应用程序运行。。。你知道吗

如果您的GUI使用许多图像,通常的做法是创建一个属性self.images,将所有需要的图像放在元组或字典中(无论您喜欢用数字还是字符串对它们进行索引),以确保所有图像都保存在内存中。你知道吗

相关问题 更多 >

    热门问题