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

Tkinter标签页内容居中与窗口自适应大小实现问询

解决Tkinter标签页的两个问题:内容居中与窗口自适应

一、让第一个标签页内容居中

原代码中第二个标签页的固定宽度框架把整个 Notebook 拉宽,导致第一个标签页的控件靠左显示。可以通过以下简洁方式实现内容居中:

将第一个标签页的所有控件放入一个子Frame,再让这个子Frame在父Frame中居中:

# 替换第一个标签页的原有代码
sub_frame = Frame(frame1, bg="blue")
sub_frame.pack(expand=True)

my_input = Entry(sub_frame, width=50)
my_input.grid(row=0, column=0, padx=10, pady=20)

drop_input = Button(sub_frame, text="drop_input", width=15)
drop_input.grid(row=0, column=1, padx=(0,10))

my_button = Button(sub_frame, text="button", width=15)
my_button.grid(row=1, column=0, columnspan=2, pady=(10,10))

子Frame会自动在父Frame中居中,不受外部宽度影响,完美解决空白区域导致的左偏问题。

二、实现切换标签页时窗口自动调整大小

绑定 Notebook 的标签切换事件,在切换时获取当前标签页的最佳尺寸,再调整主窗口大小:

步骤1:添加自适应函数

def adjust_window_size(event):
    # 获取当前选中的标签页
    current_tab = my_notebook.nametowidget(my_notebook.select())
    # 更新布局确保尺寸计算准确
    current_tab.update_idletasks()
    # 获取标签页的请求尺寸
    width = current_tab.winfo_reqwidth()
    height = current_tab.winfo_reqheight()
    # 调整主窗口大小(额外数值适配padding等边距)
    root.geometry(f"{width + 30}x{height + 50}")

步骤2:绑定切换事件

my_notebook.bind("<<NotebookTabChanged>>", adjust_window_size)

步骤3:初始化窗口尺寸

在主循环前调用一次函数,让初始窗口适配第一个标签页:

adjust_window_size(None)

完整修改后的代码

from tkinter import *
from tkinter import ttk

root = Tk()

# Tabs
my_notebook = ttk.Notebook(root)
my_notebook.pack(pady=15)

frame1 = Frame(my_notebook, bg="blue")
frame2 = Frame(my_notebook)

frame1.pack(fill="both", expand=1)
frame2.pack(fill="both", expand=1)

my_notebook.add(frame1, text="111")
my_notebook.add(frame2, text="222")

### first tab - 子Frame实现居中
sub_frame = Frame(frame1, bg="blue")
sub_frame.pack(expand=True)

my_input = Entry(sub_frame, width=50)
my_input.grid(row=0, column=0, padx=10, pady=20)

drop_input = Button(sub_frame, text="drop_input", width=15)
drop_input.grid(row=0, column=1, padx=(0,10))

my_button = Button(sub_frame, text="button", width=15)
my_button.grid(row=1, column=0, columnspan=2, pady=(10,10))

### second tab
f1 = Frame(frame2, width=600, height=10)
f1.pack_propagate(False)
f1.grid(row=0, column=0, sticky=W)

label1 = Label(f1, text="xxx").pack()

### 窗口自适应逻辑
def adjust_window_size(event):
    current_tab = my_notebook.nametowidget(my_notebook.select())
    current_tab.update_idletasks()
    width = current_tab.winfo_reqwidth()
    height = current_tab.winfo_reqheight()
    root.geometry(f"{width + 30}x{height + 50}")

my_notebook.bind("<<NotebookTabChanged>>", adjust_window_size)
adjust_window_size(None)

root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:26:00