Tkinter弹窗图片无法显示问题求助(含报错信息)
问题描述
登录后的初始界面可正常显示图片,但点击Page1按钮弹出新窗口时图片无法加载,尝试咨询老师、使用ChatGPT及查阅YouTube教程等方法均未解决,报错信息如下:
报错信息
Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\ypgnv\AppData\Local\Programs\Thonny\lib\tkinter\__init__.py", line 1921, in __call__ return self.func(*args) File "G:\PYTHON!!!!!!!!!!!!!!!!\audi website\XI project.py", line 57, in Page1 label1=tk.Label(root,image=img3) File "C:\Users\ypgnv\AppData\Local\Programs\Thonny\lib\tkinter\__init__.py", line 3187, in __init__ Widget.__init__(self, master, 'label', cnf, kw) File "C:\Users\ypgnv\AppData\Local\Programs\Thonny\lib\tkinter\__init__.py", line 2601, in __init__ self.tk.call( _tkinter.TclError: image "pyimage4" doesn't exist
相关代码
import tkinter as tk from tkinter import * from tkinter import messagebox import tkinter.font as font from tkinter import ttk from PIL import Image, ImageTk def CustomerScreen(): def Page1(): root = tk.Tk() root.geometry("1000x500") root.title("Luxury Sedans, SUVs, Electric Vehicles & More | Audi Dubai | Audi Middle East") root['background'] = 'white' tk.Label(root, text ="Explore By Models",bg="white",fg="black",font = ("Verdana", 20)).pack() C = Canvas(root, bg ="white", height = 250, width = 300) load=Image.open("a3side.png") img3=ImageTk.PhotoImage(load) label1=tk.Label(root,image=img3) label1.image=img3 label1.place(x=0,y=0) label1.pack() root.mainloop()
解决方案
问题根源是Tkinter不允许同时存在多个tk.Tk()实例——Tkinter设计上仅支持一个主窗口,新窗口需用tk.Toplevel()创建,否则会导致Tcl上下文冲突,图片资源无法正确关联。修改步骤如下:
- 将
Page1函数中的root = tk.Tk()替换为root = tk.Toplevel(),Toplevel()会基于已存在的主窗口创建子窗口,共享同一个Tcl上下文。 - 移除
root.mainloop(),主窗口已经运行了mainloop(),子窗口无需重复调用。
修改后的代码片段:
def CustomerScreen(): def Page1(): # 改用Toplevel创建子窗口 root = tk.Toplevel() root.geometry("1000x500") root.title("Luxury Sedans, SUVs, Electric Vehicles & More | Audi Dubai | Audi Middle East") root['background'] = 'white' tk.Label(root, text ="Explore By Models",bg="white",fg="black",font = ("Verdana", 20)).pack() # 原代码中Canvas变量C未使用,可选择移除或补充逻辑 # C = Canvas(root, bg ="white", height = 250, width = 300) load=Image.open("a3side.png") img3=ImageTk.PhotoImage(load) label1=tk.Label(root,image=img3) label1.image=img3 # 保持引用避免图片被垃圾回收 label1.place(x=0,y=0) label1.pack() # 移除重复的mainloop()调用 # root.mainloop()
额外注意:确保Page1是通过按钮回调正确触发的,且主窗口已经完成初始化并启动了mainloop()。
内容的提问来源于stack exchange,提问作者MrGrapes2565
相关产品推荐
相关产品推荐

