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

Tkinter函数中按钮图片无法显示,报错pyimage13不存在求助

解决Tkinter中图片按钮报错“_tkinter.TclError: image 'pyimage13' doesn't exist”的问题

问题根源

  1. 重复创建主窗口实例:你在new_grille函数里使用tk.Tk()新建了一个主窗口,但Tkinter程序应当仅存在一个主Tk()实例。重复创建会导致Tcl解释器上下文冲突,图片资源被绑定到错误的窗口实例上,进而触发找不到图片的错误。
  2. 布局方法冲突:按钮同时使用place()和pack()两种布局方式,会导致布局逻辑混乱,也可能间接影响组件的正常渲染。

修正方案

1. 改用Toplevel作为子窗口

将new_grille里的tk.Tk()替换为tk.Toplevel(),让这个窗口作为已有主窗口的子窗口,共享同一个Tcl上下文。

2. 移除重复的布局方法

保留一种布局方式(place或pack),避免布局逻辑冲突。

3. 确保图片引用不被回收

你已通过boutton_quitter.image = img_quitter保留图片引用,这个操作正确,需继续保留,防止Python垃圾回收机制销毁图片对象。

修改后的完整代码

def new_grille():
    global cc
    global tab
    global tableau

    x = cc[0]
    y = cc[1]

    # 替换tk.Tk()为tk.Toplevel(),作为主窗口的子弹窗
    fenetre = tk.Toplevel()
    fenetre.title('Gomoku : Coup joueur Blanc')
    fenetre.attributes('-fullscreen', True)
    fenetre.bind('<Escape>', lambda e: fenetre.destroy())
    fenetre.config(bg='#FFFFFF')

    tableau = tk.Canvas(fenetre, width=1700, height=1500, bg="#FFFFFF")
    tableau.pack(side=tk.BOTTOM, pady=100)

    img = Image.open('boutton quitter.png')
    img_quitter = ImageTk.PhotoImage(img)

    # 创建按钮,移除多余的lambda包装(on_closing无参数时直接传函数名)
    boutton_quitter = tk.Button(fenetre, width=45, height=7, image=img_quitter, command=on_closing)
    boutton_quitter.image = img_quitter  # 保留图片引用防止被回收
    boutton_quitter.place(x=1500, y=100)  # 仅保留一种布局方式

额外检查项

  • 确认程序初始仅创建了一个tk.Tk()实例,所有后续弹窗均使用Toplevel。
  • 检查图片路径是否正确:确保boutton quitter.png与脚本在同一目录,或使用绝对路径(如C:/your_project/boutton quitter.png)。

内容的提问来源于stack exchange,提问作者Ethan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:22:31