You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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()

效果对比

期望效果

tkinter窗口内标签页中的Treeview

当前效果(未修改代码)

当前效果截图

解决方案

只需修改一处关键配置,同时确保现有布局参数正确:

  1. 取消注释root窗口的网格权重配置,让tabControl能够填满整个主窗口空间:
    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    
  2. 你代码中已经正确设置了tab1的网格权重、Treeview和滚动条的sticky参数,无需额外修改。

修改后,Treeview会随窗口尺寸变化自动扩展,填满标签页内的可用空间。

内容的提问来源于stack exchange,提问作者Paul-ET

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:50:57