这个回调错误。我尝试使用函数从单独的脚本调用菜单。看起来垃圾收集器正在弄乱菜单图像。
我尝试将我的图像移动到字典中并调用按钮/矩形中的页面。
你说的没错,Tkinter 和 Python 的垃圾回收机制有时会导致图像无法显示的问题。这通常发生在你创建了一个
PhotoImage
对象,然后让它超出作用域时。当对象超出作用域时,Python 的垃圾回收机制可能会将其删除,导致 Tkinter 无法再找到图像。
以下是一些解决这个问题的方法:
1. 使用
self
或全局变量保存图像引用:
- 最简单的方法是将图像存储为类的属性或全局变量。这样可以确保图像在使用期间一直存在于内存中。
```python import tkinter as tk
class MyWindow: def init (self, master): self.master = master master.title("My App")
# 创建图像并将其存储为实例变量
self.my_image = tk.PhotoImage(file="my_image.png")
# 在按钮上使用图像
self.button = tk.Button(master, image=self.my_image, command=self.do_something)
self.button.pack()
def do_something(self):
print("按钮被点击了!")
root = tk.Tk() my_window = MyWindow(root) root.mainloop() ```
2. 使用
image.keep_reference()
方法:
-
PhotoImage
对象有一个keep_reference()
方法,可以用来存储对图像的额外引用。这可以防止垃圾回收机制过早地删除图像。
```python import tkinter as tk
def create_button(master): # 创建图像 my_image = tk.PhotoImage(file="my_image.png")
# 使用 keep_reference() 保存对图像的引用
my_image.keep_reference(master)
# 在按钮上使用图像
button = tk.Button(master, image=my_image, command=do_something)
button.pack()
def do_something(): print("按钮被点击了!")
root = tk.Tk() create_button(root) root.mainloop() ```
3. 将图像存储在字典中:
- 你可以将图像存储在字典中,并使用键来访问它们。这可以帮助你组织图像,并确保它们在需要时可用。
```python import tkinter as tk
class MyWindow: def init (self, master): self.master = master master.title("My App")
# 创建图像字典
self.images = {
"image1": tk.PhotoImage(file="image1.png"),
"image2": tk.PhotoImage(file="image2.png"),
}
# 在按钮上使用图像
self.button1 = tk.Button(master, image=self.images["image1"], command=self.do_something)
self.button1.pack()
def do_something(self):
print("按钮被点击了!")
root = tk.Tk() my_window = MyWindow(root) root.mainloop() ```
请根据你的代码结构选择最适合你的方法。 记住,只要确保
PhotoImage
对象在使用期间不会被垃圾回收即可。