Tkinter函数中按钮图片无法显示,报错pyimage13不存在求助
解决Tkinter中图片按钮报错“_tkinter.TclError: image 'pyimage13' doesn't exist”的问题
问题根源
- 重复创建主窗口实例:你在
new_grille函数里使用tk.Tk()新建了一个主窗口,但Tkinter程序应当仅存在一个主Tk()实例。重复创建会导致Tcl解释器上下文冲突,图片资源被绑定到错误的窗口实例上,进而触发找不到图片的错误。 - 布局方法冲突:按钮同时使用
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
相关产品推荐
相关产品推荐

