You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:27:34