tk.PhotoImage在多Tk()实例场景下无法加载图片的问题
问题原因
在Tkinter应用中,只能存在一个Tk()主窗口实例。你在main_test里创建了一个主窗口,又在side_test里新建了另一个Tk()实例,这会启动两个独立的Tcl解释器,导致图片资源的命名空间冲突,从而触发pyimage2 doesn't exist错误。单独运行side_test时只有一个Tk()实例,所以不会出现问题。
另外主菜单代码里还有一处错误:创建Button时用了window而不是self.window,这会引发NameError,需要一并修复。
修复方案
修改side_test.py
将side_test类改为使用Toplevel创建子窗口,接收主窗口作为父容器:
from tkinter import * import tkinter as tk class side_test(): # 新增master参数,接收主窗口实例 def __init__(self, master): # 使用Toplevel创建依附于主窗口的子窗口 self.window = tk.Toplevel(master) self.window.geometry("500x500+100+100") self.my_image = tk.PhotoImage(file='req_hv.png') self.my_button = Button(self.window, image=self.my_image) self.my_button.image = self.my_image self.my_button.pack() def run(self): # 无需单独调用mainloop,主窗口的事件循环已在运行 pass
修改main_test.py
修复Button的父容器参数,并在调用side_test时传入主窗口实例:
from tkinter import * import tkinter as tk from side_test import side_test class main_test(): def __init__(self): self.window = Tk() self.window.geometry("300x300") self.main_image = tk.PhotoImage(file='req.png') # 修复父容器为self.window self.my_button = Button(self.window, image=self.main_image, command=self.side_form) self.my_button.image = self.main_image self.my_button.pack() def side_form(self): # 传入主窗口实例作为子窗口的父容器 my_obj = side_test(self.window) def run(self): self.window.mainloop() if __name__ == '__main__': obj = main_test() obj.run()
关键说明
Toplevel()用于创建依附于主窗口的子窗口,共享同一个Tcl解释器上下文,彻底避免资源冲突问题。- 子窗口不需要单独调用
mainloop(),主窗口的mainloop()会统一处理所有窗口的事件循环。 - 所有控件的
master参数必须指向正确的父容器,避免作用域错误。
内容的提问来源于stack exchange,提问作者Hamid Shah
相关产品推荐
相关产品推荐

