Tkinter Designer

← Guías de tkinter

¿Cómo agrego un scrollbar o barra de desplazamiento en tkinter?

La barra y el widget al que desplaza tienen que conocerse mutuamente, y eso son dos líneas de configuración distintas. Casi todos los "mi barra de desplazamiento no hace nada" son una de las dos que falta.

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

box = tk.Listbox(root)
bar = ttk.Scrollbar(root, orient="vertical", command=box.yview)  # barra -> widget
box.configure(yscrollcommand=bar.set)                            # widget -> barra

box.pack(side="left", fill="both", expand=True)
bar.pack(side="right", fill="y")

for i in range(100):
    box.insert("end", f"fila {i}")

root.mainloop()

Qué hace cada mitad

command=box.yview es la mitad de ida: arrastrar la barra le dice al widget que se desplace. yscrollcommand=bar.set es la mitad de vuelta: el widget le dice a la barra cuánto se está viendo y en qué posición, que es lo que dimensiona y mueve el pulgar.

Con solo la primera línea, la barra desplaza la lista pero su pulgar ocupa todo el recorrido y nunca se mueve, porque nadie informa de la posición. Con solo la segunda, el pulgar sigue la vista pero arrastrarlo no hace nada. Los dos síntomas parecen una barra rota y son el mismo par que falta.

El desplazamiento horizontal usa el par de la x

La misma forma se aplica de lado con xview y xscrollcommand, y la barra necesita orient="horizontal" y fill="x" al empaquetarla. Un widget puede llevar las dos a la vez.

hbar = ttk.Scrollbar(root, orient="horizontal", command=box.xview)
box.configure(xscrollcommand=hbar.set)
hbar.pack(side="bottom", fill="x")

Qué widgets se pueden desplazar

Listbox, Text, Canvas y Treeview admiten el par. Un Frame normal no: los frames no tienen una vista que desplazar, y por eso un panel de widgets con scroll se construye sobre un Canvas y es una receta aparte.

Empaquetarla para que se vea

Una barra vertical necesita fill="y" para estirarse por su costado; sin eso queda con su altura natural y se ve raquítica o desaparece. Empaqueta la barra y el widget en el mismo contenedor, con el widget expandiéndose y la barra no.

Hacerlo sin buscarlo

Coloca una Scrollbar y elige en el inspector a qué widget mueve. La exportación escribe las dos mitades de la conexión, que es la parte que conviene tener resuelta: no hay forma de terminar con la versión a medio conectar.

Diseña la ventana visualmente y ve el código Python generado sobre la marcha.

Abrir el diseñador de tkinter →

Preguntas relacionadas