如何创建带Treeview对象的Toplevel窗口及滚动条异常排查
问题核心原因
- 自定义的
Treeview类继承自Toplevel,但在__init__方法中直接把self重新赋值为ttk.Treeview实例,覆盖了原本指向弹出窗口的self,导致后续创建滚动条时父容器错误(滚动条的父变成了Treeview控件本身,而不是弹出窗口),最终布局冲突导致Treeview消失。 - 代码中未显式导入
ttk模块,直接调用ttk.Treeview、ttk.Button会触发未定义报错。 - 弹出窗口的网格布局没有设置行列权重,控件无法正常自适应窗口大小。
修正后可运行代码
from tkinter import * from tkinter import ttk # 自定义弹出窗口类,避免和ttk.Treeview重名混淆 class ContactWindow(Toplevel): def __init__(self, parent): super().__init__(parent) self.title('Contacts List') self.geometry('1050x527') # 设置窗口网格布局权重,让第0行第0列随窗口拉伸 self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) columns = ('#1', '#2', '#3', '#4', '#5') # 单独定义Treeview实例,不要覆盖self self.tree = ttk.Treeview(self, columns=columns, show='headings') self.tree.heading('#1', text='Name') self.tree.heading('#2', text='Birthday') self.tree.heading('#3', text='Email') self.tree.heading('#4', text='Number') self.tree.heading('#5', text='Notes') self.tree.grid(row=0, column=0, sticky='nsew') # 滚动条父容器为当前弹出窗口,关联tree的yview方法 scrollbar = ttk.Scrollbar(self, orient=VERTICAL, command=self.tree.yview) self.tree.configure(yscrollcommand=scrollbar.set) scrollbar.grid(row=0, column=1, sticky='ns') root = Tk() def open_contact_window(): new = ContactWindow(root) button7 = ttk.Button(root,text="Contacts", command=open_contact_window) button7.grid(row=1,column=0) root.mainloop()
修改说明
- 将自定义的窗口类改名避免和
ttk.Treeview重名混淆,不再覆盖self,单独定义self.tree存储Treeview实例。 - 补充导入
ttk模块,解决控件未定义问题。 - 给弹出窗口设置网格布局权重,保证Treeview可以自适应窗口大小。
- 滚动条的父容器指定为弹出窗口本身,正确关联Treeview的滚动方法,布局位置符合预期。
内容的提问来源于stack exchange,提问作者GGGGGG
相关产品推荐
相关产品推荐

