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
相关产品推荐
相关产品推荐

