如何让ttk.Notebook标签页内的Treeview自动调整尺寸
如何让ttk.Notebook标签页中的Treeview随窗口自动调整尺寸?
我在ttk.Notebook组件的标签页中创建了一个Treeview,想要实现Treeview随窗口自动调整尺寸、填充所有可用空间的效果。参考过相关布局方案,但不想混合使用.grid与.pack布局,调整字体大小也没有明显效果,Treeview放置在标签页的Frame中始终无法填满空间。
示例代码
import tkinter as tk from tkinter import ttk from tkinter.messagebox import showinfo root = tk.Tk() root.title('Treeview demo') root.geometry('800x400') # root.grid_rowconfigure(0, weight=1) # root.grid_columnconfigure(0, weight=1) tabControl = ttk.Notebook(root) tab1 = ttk.Frame(tabControl) tabControl.add(tab1, text="Tab 1") tab2 = ttk.Frame(tabControl) tabControl.add(tab2, text="Tab 2") tab1.grid_rowconfigure(0, weight=1) tab1.grid_columnconfigure(0, weight=1) tabControl.grid(row=0, column=0, sticky='nsew') # style the widget s = ttk.Style() s.theme_use('clam') LARGE_FONT = 14 MON_FONTSIZE = 12 s.configure('Treeview.Heading', font=(None, LARGE_FONT), rowheight=int(LARGE_FONT*2.5)) s.configure('Treeview', font=(None, MON_FONTSIZE), rowheight=int(MON_FONTSIZE*2.5)) # define columns columns = ('first_name', 'last_name', 'email') tree = ttk.Treeview(tab1, columns=columns, show='headings') # define headings tree.heading('first_name', text='First Name') tree.heading('last_name', text='Last Name') tree.heading('email', text='Email') s.configure('Treeview.Heading', background="green3") # generate sample data contacts = [] for n in range(1, 100): contacts.append((f'first {n}', f'last {n}', f'email{n}@example.com')) # add data to the treeview AND tag the row color i = 1 for contact in contacts: i += 1 if i%2: tree.insert('', tk.END, values=contact, tags = ('oddrow',)) else: tree.insert('', tk.END, values=contact, tags = ('evenrow',)) def item_selected(event): for selected_item in tree.selection(): item = tree.item(selected_item) record = item['values'] # show a message showinfo(title='Information', message=','.join(record)) tree.bind('<<TreeviewSelect>>', item_selected) tree.grid(row=0, column=0, sticky='nsew') # add a scrollbar scrollbar = ttk.Scrollbar(tab1, orient=tk.VERTICAL, command=tree.yview) tree.configure(yscroll=scrollbar.set) scrollbar.grid(row=0, column=1, sticky='ns') # style row colors tree.tag_configure('oddrow', background='lightgrey') tree.tag_configure('evenrow', background='white') # run the app root.mainloop()
效果对比
期望效果

当前效果(未修改代码)

解决方案
只需修改一处关键配置,同时确保现有布局参数正确:
- 取消注释
root窗口的网格权重配置,让tabControl能够填满整个主窗口空间:root.grid_rowconfigure(0, weight=1) root.grid_columnconfigure(0, weight=1) - 你代码中已经正确设置了
tab1的网格权重、Treeview和滚动条的sticky参数,无需额外修改。
修改后,Treeview会随窗口尺寸变化自动扩展,填满标签页内的可用空间。
内容的提问来源于stack exchange,提问作者Paul-ET
相关产品推荐
相关产品推荐

