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

如何让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布局的自适应扩展。

解决步骤

  1. 给panel_izquierdo和panel_derecho的grid方法添加sticky='nsew',并配置root的列权重,让左右面板按比例分配宽度。
  2. 调整panel_izquierdo内布局:将frame_cartel_flota放在row=0,frame_botones_flota放在row=1,配置行权重让row=1占据剩余空间。
  3. 给frame_botones_flota添加列/行权重,确保内部组件可扩展。
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:45:37