Tkinter点击按钮创建带Treeview标签页报错AttributeError咨询
解决Tkinter中创建Treeview时的AttributeError: 'str' object has no attribute 'tk'问题
你遇到的核心问题是给Treeview传错了父容器参数——大概率是把标签页的名称字符串当成了root(也就是master)参数传给了Treeview,但Treeview需要的是一个实实在在的Tkinter容器控件对象,比如Frame或者Notebook的标签页载体,而不是字符串。
错误原因拆解
报错AttributeError: 'str' object has no attribute 'tk'已经说得很清楚:你传入的是一个字符串,而Treeview需要的是带有.tk属性的Tkinter控件实例。比如如果你写了类似ttk.Treeview("新标签页")这种代码,就会触发这个错误,因为字符串根本没有tk属性。
修正后的完整代码示例
我帮你补全并修正了代码,核心是在按钮点击时先创建一个Frame作为标签页的容器,再把Treeview挂载到这个Frame上:
from tkinter import * from tkinter import ttk import math import sys def create_new_tab(): # 1. 创建一个Frame作为新标签页的载体容器 new_tab_frame = ttk.Frame(tasktabs) # 2. 把这个Frame添加到Notebook中,设置标签显示名称 tasktabs.add(new_tab_frame, text="新任务标签") # 3. 创建Treeview,这里的master参数传入刚才的Frame对象,而非字符串 tree = ttk.Treeview(new_tab_frame) # 配置Treeview的列和表头 tree["columns"] = ("任务名称", "状态") tree.column("#0", width=80, minwidth=80) tree.column("任务名称", width=300, minwidth=200) tree.column("状态", width=150, minwidth=100) tree.heading("#0", text="序号") tree.heading("任务名称", text="任务名称") tree.heading("状态", text="完成状态") # 插入示例数据 tree.insert("", END, text="1", values=("编写项目文档", "已完成")) # 让Treeview占满整个标签页容器 tree.pack(fill=BOTH, expand=True) myApp = Tk() myApp.title("Program") myApp.geometry("1000x1200") # 初始化Notebook并布局 tasktabs = ttk.Notebook(myApp) tasktabs.pack(fill=BOTH, expand=True, padx=10, pady=10) # 创建触发按钮 NewWorkLab = Label(myApp, text="Name: ") NewWorkLab.pack(side=LEFT, padx=5) NewWorkBtn = Button(myApp, text="创建新标签页", command=create_new_tab) NewWorkBtn.pack(side=LEFT, pady=5) myApp.mainloop()
关键步骤说明
- 每次点击按钮时,先创建一个
ttk.Frame作为新标签页的容器,这个Frame是Tkinter的控件实例,具备Treeview需要的.tk属性。 - 用
tasktabs.add()把Frame添加到Notebook中,设置显示的标签文本。 - 创建Treeview时,将刚才的Frame作为
master参数传入,这样Treeview就明确知道要挂载到哪个容器里了。
内容的提问来源于stack exchange,提问作者Aleksandar Beat
相关产品推荐
相关产品推荐

