开发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
相关产品推荐
相关产品推荐

