Tkinter中tableone仅显示在floorplan窗口?报错'int'对象无'_create'属性
修复Tkinter中AttributeError: 'int' object has no attribute '_create'问题
错误原因
- 误用Canvas类方法而非实例方法:直接调用
Canvas.create_rectangle()是调用Tkinter的Canvas类,会返回整数类型的图形ID,后续将这个ID赋值给tableone后,再用tableone.create_text()就会触发错误——整数对象不存在_create属性。 - Canvas归属错误:原代码里的
canvas属于主窗口root,就算创建图形也不会显示在floorplan子窗口,必须为子窗口单独创建Canvas实例。 - Canvas未添加到窗口:任何Tkinter组件都需要通过
pack()/place()/grid()方法挂载到窗口,否则不会显示。
修复后的完整代码
from tkinter import * root = Tk() root.title("Main window") root.geometry("1366x768") # 点击事件处理 def clicked(*args): print("clicked") def create_floorplan(): floorplan = Toplevel() floorplan.title("Floor plan") floorplan.geometry("1366x768") # 为floorplan窗口创建专属Canvas并铺满窗口 fp_canvas = Canvas(floorplan, width=1366, height=768) fp_canvas.pack(fill=BOTH, expand=True) # 用fp_canvas实例创建图形,绑定统一标签 fp_canvas.create_rectangle(75, 55, 195, 105, fill="silver", activefill="gray", tags="tableone") fp_canvas.create_text(137, 80, text="1", font=("Helvetica", 20), fill="white", tags="tableone") # 绑定标签的点击事件到当前Canvas fp_canvas.tag_bind("tableone", "<Button-1>", clicked) # 测试按钮 testbutton = Button(floorplan, text="test") testbutton.place(x=10, y=10) button1 = Button(root, text="floor plan", command=create_floorplan) button1.place(x=10, y=10) root.mainloop()
关键修改点
- 移除了主窗口的
canvas变量(若主窗口不需要可直接删除),在create_floorplan中为子窗口创建专属的fp_canvas实例,并用pack(fill=BOTH, expand=True)让它铺满整个子窗口。 - 所有图形创建方法(
create_rectangle、create_text)都通过fp_canvas实例调用,不再直接操作Canvas类。 - 使用
fp_canvas.tag_bind绑定点击事件,确保事件只作用于子窗口内的图形。 - 通过统一标签
tableone关联矩形和文字,点击其中任意一个都会触发clicked函数,无需单独保存图形ID。
内容的提问来源于stack exchange,提问作者j.jam
相关产品推荐
相关产品推荐

