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

开发Minecraft Tellraw命令生成器时,Tkinter Canvas调用pack()方法出现AttributeError错误求助

解决Tkinter Canvas中create_image后调用pack()出现AttributeError的问题

嘿,我来帮你搞定这个报错!咱们先拆解下问题根源:

错误原因

你代码里的变量赋值逻辑出了核心问题:

MAIN_MENU_TELLRAW_IMAGE = Canvas(window, width=157, height=100)
MAIN_MENU_TELLRAW_IMAGE = MAIN_MENU_TELLRAW_IMAGE.create_image((157, 100), image=PhotoImage(file='assets/img/tellraw_logo.png'))

第一行你创建了一个Canvas对象并赋值给MAIN_MENU_TELLRAW_IMAGE,但第二行直接把create_image的返回值(一个整数,代表图像在Canvas内的唯一ID)重新赋值给了同一个变量。这就导致后面调用MAIN_MENU_TELLRAW_IMAGE.pack()时,实际是在对一个整数调用pack方法——整数当然没有这个属性,所以才会抛出AttributeError!

另外还有个容易踩的小坑:Tkinter的PhotoImage如果只作为临时变量存在,会被Python的垃圾回收机制清理掉,最后你可能会发现Canvas上什么都没显示,所以得给它留个持久化的引用。

修复后的完整代码

下面是调整后的代码,我已经把所有问题都修正了:

from tkinter import *
# Window
window = Tk()
window.title('Minecraft Generator')
window.geometry("1080x600")
window.minsize(1080, 600)
window.maxsize(1080, 600)
window.iconbitmap('assets/img/logo.ico')
# Config
window.config(background='#627f1f')
#Composants
# Main Menu Title
TITLE_FRAME = Frame(window, bg='#627f1f')
MAIN_MENU_TITLE = Label(TITLE_FRAME, text='Minecraft Generator' , font=("Courrier", 40), bg='#627f1f' , fg='white')
MAIN_MENU_SUBTITLE = Label(TITLE_FRAME, text='A Minecraft Generator for all needs !' , font=("Courrier", 15), bg='#627f1f' , fg='white')
# Main Menu TellRaw
MAIN_MENU_TELLRAW_BUTTON = Button(TITLE_FRAME, text='Tellraw Command', bg='white' , fg='#627f1f' , font=("Courrier News", 15))
# 修复部分:保留Canvas对象引用,单独处理图片
MAIN_MENU_TELLRAW_IMAGE = Canvas(window, width=157, height=100, bg='#627f1f')
# 创建图片对象并保存引用
tellraw_img = PhotoImage(file='assets/img/tellraw_logo.png')
# 在Canvas中心添加图片(坐标是Canvas宽高的一半)
MAIN_MENU_TELLRAW_IMAGE.create_image(78.5, 50, image=tellraw_img)
# 把图片绑定到Canvas对象上,防止被垃圾回收
MAIN_MENU_TELLRAW_IMAGE.image = tellraw_img
# Packing
# Title Frame
MAIN_MENU_TITLE.pack()
MAIN_MENU_SUBTITLE.pack()
TITLE_FRAME.pack(side='top')
# TellRaw
MAIN_MENU_TELLRAW_BUTTON.pack(pady=25)
MAIN_MENU_TELLRAW_IMAGE.pack()
# Display Window
window.mainloop()

关键修改点说明

  • 不再用create_image的返回值覆盖Canvas对象的引用,保证MAIN_MENU_TELLRAW_IMAGE始终是Canvas实例
  • 单独创建tellraw_img变量保存PhotoImage对象,并且把它绑定到Canvas的image属性上,避免被垃圾回收
  • 调整了图片的位置到Canvas中心(78.5,50是157/2和100/2),你可以根据自己的UI需求改成其他坐标

这样修改后,你的Canvas就能正常显示图片,也不会再出现AttributeError啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:17:37