Tkinter报错‘pyimage1 doesn't exist’,如何设置背景图片?
解决tkinter背景图片报错“_tkinter.TclError: image 'pyimage1' doesn't exist”
问题根源
- 多个Tk实例冲突:你的代码同时创建了
App(tk.Tk)和self.root1 = Tk()两个主窗口实例,tkinter不允许存在多个Tcl上下文,这会导致图片资源无法正确绑定到窗口。 - PhotoImage被垃圾回收:
bg = ImageTk.PhotoImage(img)创建的对象没有持久引用,当__init__方法执行完毕后,Python垃圾回收机制会回收该对象,导致界面找不到图片资源。
修正后的代码
import tkinter as tk from PIL import Image, ImageTk class App(tk.Tk): def __init__(self): super().__init__() self.geometry('800x690') self.title('tkinter') # 加载并调整图片尺寸(可选,适配窗口大小) img = Image.open('4.jpg') img = img.resize((800, 690), Image.Resampling.LANCZOS) # 创建PhotoImage对象并保留实例引用 self.bg_image = ImageTk.PhotoImage(img) # 创建背景标签并铺满整个窗口 bg_label = tk.Label(self, image=self.bg_image) bg_label.place(x=0, y=0, relwidth=1, relheight=1) # 额外保留引用,防止垃圾回收 bg_label.image = self.bg_image if __name__ == "__main__": app = App() app.mainloop()
关键修改说明
- 移除了多余的
self.withdraw()和self.root1 = Tk(),直接使用继承的App类作为主窗口,确保只有一个Tk实例。 - 将
PhotoImage对象绑定到实例属性self.bg_image,同时绑定到标签的image属性,避免被垃圾回收。 - 使用
relwidth=1和relheight=1让背景标签自动适配窗口大小,无需手动固定坐标。 - 统一导入tkinter为
tk,优化代码可读性。
内容的提问来源于stack exchange,提问作者pegah zahedi
相关产品推荐
相关产品推荐

