如何让Tkinter的Notebook占满‘Flota’标题下方全部空间?
Tkinter Notebook组件无法展开/尺寸过小的解决方法
问题描述
Tkinter Notebook组件无法展开,显示尺寸过小。尝试过grid布局配置、pack(fill='both', expand='yes')方法,以及将Notebook放在“Flota”标题下方的Frame中,均未解决问题。
问题原因
原代码存在以下布局逻辑问题:
- 左侧面板
panel_izquierdo未设置sticky属性,且未配置root的列权重,无法填充分配的空间。 frame_botones_flota与frame_cartel_flota重叠在panel_izquierdo的同一行,导致Notebook没有足够显示区域。- 承载Notebook的
frame_botones_flota未配置列/行权重,无法将空间传递给内部组件。 - 使用带
padx/pady的Label作为占位容器,固定尺寸阻碍了grid布局的自适应扩展。
解决步骤
- 给
panel_izquierdo和panel_derecho的grid方法添加sticky='nsew',并配置root的列权重,让左右面板按比例分配宽度。 - 调整
panel_izquierdo内布局:将frame_cartel_flota放在row=0,frame_botones_flota放在row=1,配置行权重让row=1占据剩余空间。 - 给
frame_botones_flota添加列/行权重,确保内部组件可扩展。 - Notebook的
grid方法设置sticky='nsew',移除无用的占位Label。
修改后的代码
import tkinter as tk from tkinter import ttk # 窗口基础设置 root = tk.Tk() width = root.winfo_screenwidth() height = root.winfo_screenheight() root.title("Tallers Citoler - Gestor de flotas") root.geometry("1600x900") # 窗口居中 pwidth = round(width/2 - 1600/2) pheight = round(height/2 - 900/2) root.geometry(f"1600x900+{pwidth}+{pheight}") root.resizable(False, False) root.config(bg='blue') # 配置root列权重,左右面板按1:2分配宽度(可按需调整) root.grid_columnconfigure(0, weight=1) root.grid_columnconfigure(1, weight=2) root.grid_rowconfigure(1, weight=1) # 让第二行占据剩余高度 ############################################################### # 顶部标题区域 frame_titulo = tk.Frame(root, bd=1, relief=tk.FLAT, bg='black') frame_titulo.grid(sticky='nsew', columnspan=2) etiqueta_titulo = tk.Label(frame_titulo, text='Tallers Citoler - Sistema de Gestion de Flotas', fg='black', font=('Dosis', 48), bg='darksalmon', padx=147, pady=1) etiqueta_titulo.grid(row=0, column=0, columnspan=2, sticky='nsew') frame_titulo.grid_rowconfigure(0, weight=1) frame_titulo.grid_columnconfigure(0, weight=1) ############################################################### # 左侧面板区域 panel_izquierdo = tk.Frame(root, bd=1, relief=tk.FLAT, bg='black') panel_izquierdo.grid(row=1, column=0, sticky='nsew') # 填充所在单元格 # 配置左侧面板行权重:row0为标题,row1为Notebook区域 panel_izquierdo.grid_rowconfigure(0, weight=0) panel_izquierdo.grid_rowconfigure(1, weight=1) panel_izquierdo.grid_columnconfigure(0, weight=1) # 'Flota'标题 frame_cartel_flota = tk.Frame(panel_izquierdo, bd=1, relief=tk.FLAT, bg='black') frame_cartel_flota.grid(row=0, column=0, sticky='nsew') cartel_flota = tk.Label(frame_cartel_flota, text='Flota', font=('Dosis', 34), bg='#EED5B7', padx=220) cartel_flota.grid(row=0, column=0, sticky='nsew') frame_cartel_flota.grid_rowconfigure(0, weight=1) frame_cartel_flota.grid_columnconfigure(0, weight=1) # Notebook容器 frame_botones_flota = tk.Frame(panel_izquierdo, bd=1, relief=tk.FLAT, bg='black') frame_botones_flota.grid(row=1, column=0, sticky='nsew') # 占据剩余空间 frame_botones_flota.grid_columnconfigure(0, weight=1) frame_botones_flota.grid_rowconfigure(0, weight=1) # Notebook组件 notebook_flota = ttk.Notebook(frame_botones_flota) notebook_flota.grid(column=0, row=0, sticky='nsew') # 填充父容器 p1 = ttk.Frame(notebook_flota) p2 = ttk.Frame(notebook_flota) p3 = ttk.Frame(notebook_flota) # 配置每个Notebook页面的权重,支持内部组件扩展 for page in [p1, p2, p3]: page.grid_columnconfigure(0, weight=1) page.grid_rowconfigure(0, weight=1) # 添加页面 notebook_flota.add(p1, text='Carretillas') notebook_flota.add(p2, text='Elevadores') notebook_flota.add(p3, text='Vehiculos') ############################################################### # 右侧面板区域 panel_derecho = tk.Frame(root, bd=1, relief=tk.FLAT, bg='black') panel_derecho.grid(row=1, column=1, sticky='nsew') # 填充所在单元格 panel_derecho.grid_rowconfigure(0, weight=0) panel_derecho.grid_rowconfigure(1, weight=1) panel_derecho.grid_columnconfigure(0, weight=1) # 'Recordatorios'标题 frame_cartel_recordatorios = tk.Frame(panel_derecho, bd=1, relief=tk.FLAT, bg='black') frame_cartel_recordatorios.grid(row=0, column=0, sticky='nsew') cartel_recordatorios = tk.Label(frame_cartel_recordatorios, text='Recordatorios', font=('Dosis', 34), bg='khaki', padx=384) cartel_recordatorios.grid(row=0, column=0, sticky='nsew') frame_cartel_recordatorios.grid_rowconfigure(0, weight=1) frame_cartel_recordatorios.grid_columnconfigure(0, weight=1) # 记录信息区域 frame_info_recordatorios = tk.Frame(panel_derecho, bd=1, relief=tk.FLAT, bg='black') frame_info_recordatorios.grid(row=1, column=0, sticky='nsew') frame_info_recordatorios.grid_columnconfigure(0, weight=1) frame_info_recordatorios.grid_rowconfigure(0, weight=1) cartel_info_recordatorios = tk.Label(frame_info_recordatorios, bg='yellow') cartel_info_recordatorios.grid(row=0, column=0, sticky='nsew') ############################################################### root.mainloop()
内容的提问来源于stack exchange,提问作者Ricard Citoler
相关产品推荐
相关产品推荐

