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

Tkinter Notebook标签页中Entry组件用pack(side=LEFT)不显示问题求助

问题原因分析
  1. 布局顺序逻辑错误:你在未完成tab1内所有组件(Treeview、item_box_fn)的布局时,先执行了tabControl.pack(),导致Notebook尺寸固定后,后续添加的组件布局无法正确更新。
  2. 组件尺寸与容器空间不匹配:
    • Notebook设置了固定的width=700和height=400,而Treeview的列宽总和(180+180+150+150=660)加上左右padx已接近Notebook宽度。
    • item_box_fn默认pack()未设置fill='x',无法填充tab1的可用宽度;同时Label和Entry的width=100(ttk中width单位为字符)过大,横向排列后总宽度超出Notebook可视范围,且Treeview已占据大部分垂直空间,导致Entry被挤出可视区域。
修复后的代码
self.container_frame = ttk.Frame(self)
self.container_frame.pack(expand=1, fill="both")  # 让容器填充父窗口

tabControl = ttk.Notebook(self.container_frame)  # 移除固定width/height,让它自适应
# 若需固定尺寸,后续需调整内部组件适配空间
# tabControl = ttk.Notebook(self.container_frame, width=700, height=400)

tab1 = ttk.Frame(tabControl)
tab2 = ttk.Frame(tabControl)
tab3 = ttk.Frame(tabControl)
tab4 = ttk.Frame(tabControl)

tabControl.add(tab1, text='Staff Details')

self.cols_names = ['Forename', 'Surname', 'email', 'Phone']
self.cols = ['forename', 'surname', 'email', 'phone']
self.col_widths = [180, 180, 150, 150]

self.tree = ttk.Treeview(tab1, selectmode='browse', columns=self.cols, show='headings')
self.tree["displaycolumns"] = (0, 1, 2, 3)

i = 0
for x in self.cols:
    self.tree.heading(i, text=self.cols_names[i])
    self.tree.column(i, width=self.col_widths[i])
    i = i + 1
self.tree.pack(padx=10, pady=5, fill="both", expand=1)  # 让Treeview填充tab1可用空间

self.tutor_list = global_list_tutors()
print(self.tutor_list)

inc = 0
for data in self.tutor_list:
    self.tree.insert("", iid=inc, index='end', text=data[0], values=(data[1], data[2], data[3]))
    inc = inc +1

# 先完成tab1所有组件布局,再pack Notebook
item_box_fn = ttk.Frame(tab1)
item_box_fn.pack(fill="x", padx=10, pady=5)  # 让Frame填充tab1宽度

item_label_fn = ttk.Label(item_box_fn, text="Forename", width=10)  # 减小Label固定宽度
item_label_fn.pack(side=LEFT, padx=(0, 5))  # 增加右侧间距提升美观度

item_field_fn = ttk.Entry(item_box_fn)  # 移除固定width,让它自适应剩余空间
item_field_fn.pack(side=LEFT, fill="x", expand=1)  # 让Entry填充Frame剩余宽度

tabControl.add(tab2, text='Finance & Charges')
tabControl.add(tab3, text='Institution Details')
tabControl.add(tab4, text='General')

tabControl.pack(expand=1, fill="both", padx=10, pady=5)  # 最后执行Notebook的pack
关键修复点
  • 调整tabControl.pack()到所有tab1组件创建完成之后,确保Notebook能正确计算内部布局。
  • 给item_box_fn添加fill="x",让它填充tab1的可用宽度。
  • 减小Label的固定宽度,给Entry设置fill="x"和expand=1,让它自适应剩余空间。
  • 给Treeview添加fill="both"和expand=1,让它合理占据tab1的垂直空间,避免挤压下方组件。

内容的提问来源于stack exchange,提问作者Chris McCartney

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:05:32