DMarlon Studio

Lección 7 · 7 de 20

Pestañas con Notebook · tkinter

Organice una ventana de tkinter en pestañas con ttk.Notebook: páginas, una pestaña desactivada, la pestaña inicial y el aviso de cambio.

tkinter · Pestañas con Notebook en DMarlon Studio: el código del ejemplo y la ventana que abre al ejecutarlo

ttk.Notebook es un contenedor con pestañas que enseña una página cada vez. Cada página es un componente —normalmente un ttk.Frame— creado con el cuaderno como padre y añadido con add(página, text="General").

La primera página es un marco con su propio grid: nombre, idioma y una casilla, con los valores puestos desde el código (StringVar, set("English") y BooleanVar). La segunda demuestra que una página puede ser cualquier componente, aquí una sola etiqueta con padding.

state="disabled" deja una pestaña gris que no se puede abrir, útil para opciones que todavía no aplican. select(general) elige la página visible al empezar; también acepta su número (select(0)).

Al cambiar de pestaña, el cuaderno lanza el evento virtual <<NotebookTabChanged>>. La etiqueta de abajo lo aprovecha: index("current") es el número de la pestaña visible, index("end") el total y tab("current", "text") su texto.

En DMarlon Studio es el Control de páginas de la paleta: añade las páginas en el inspector, arrastra componentes a cada una y el estudio genera el ttk.Notebook con un marco por página.

Código · main.py

import tkinter as tkfrom tkinter import ttkroot = tk.Tk()root.title("Settings")root.geometry("460x300")name, reopen = tk.StringVar(value="Ana López"), tk.BooleanVar(value=True)# A Notebook holds pages; each page is a Frame added with a tab text.book = ttk.Notebook(root)book.pack(fill="both", expand=True, padx=10, pady=(10, 4))general = ttk.Frame(book, padding=16)ttk.Label(general, text="Name:").grid(row=0, column=0, sticky="w", pady=4)ttk.Entry(general, width=28, textvariable=name).grid(row=0, column=1)ttk.Label(general, text="Language:").grid(row=1, column=0, sticky="w", pady=4)language = ttk.Combobox(general, width=26, values=["English", "Spanish"], state="readonly")language.grid(row=1, column=1)language.set("English")ttk.Checkbutton(general, text="Open the last project at start",                variable=reopen).grid(row=2, column=1, sticky="w", pady=8)book.add(general, text="General")book.add(ttk.Label(book, text="Theme and font size go here.", padding=16), text="Appearance")book.add(ttk.Frame(book), text="Advanced", state="disabled")  # greyed out# <<NotebookTabChanged>> fires when another tab is shown.status = ttk.Label(root)status.pack(anchor="w", padx=14, pady=(0, 8))book.bind("<<NotebookTabChanged>>", lambda e: status.config(    text=f"Tab {book.index('current') + 1} of {book.index('end')}: {book.tab('current', 'text')}"))book.select(general)  # the page shown at startroot.mainloop()

Para recordar

  • add(página, text=...) añade una pestaña.
  • select() elige la pestaña visible.
  • state="disabled" desactiva una pestaña.
  • <<NotebookTabChanged>> avisa del cambio.

Ejercicio

Cambie la pestaña «Appearance» por un marco con dos opciones (Light y Dark) y haga que la ventana se abra en ella.