¿Cómo agrego una línea separadora en tkinter?
Usa ttk.Separator con un orient, y dale un largo al colocarlo. Por sí solo un separador no ocupa espacio, y por eso el primer intento de siempre parece no hacer absolutamente nada.
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
tk.Label(root, text="Cuenta").pack()
ttk.Separator(root, orient="horizontal").pack(fill="x", pady=8)
tk.Label(root, text="Pago").pack()
root.mainloop() Por qué el tuyo es invisible
Un separador no pide espacio propio: empaquetado sin fill, uno horizontal mide un píxel por un píxel, un punto que no vas a encontrar nunca en una ventana de 300. Con fill="x" se estira a lo ancho de su contenedor y aparece de inmediato, de un píxel de alto y tan ancho como el espacio permita.
Lo mismo vale para uno vertical, que necesita fill="y" para tener altura. En un grid, sticky="ew" y sticky="ns" hacen el mismo trabajo, y una línea horizontal casi siempre quiere columnspan para cruzar todo el diseño y no una sola columna.
ttk.Separator(root, orient="horizontal").pack(fill="x")
ttk.Separator(root, orient="vertical").pack(side="left", fill="y")
# en un grid
ttk.Separator(root, orient="horizontal").grid(row=2, columnspan=3, sticky="ew")Darle aire
Una división funciona tanto por el espacio a su alrededor como por la línea en sí, así que deja margen en vez de pegarla a los widgets de los lados. Con pady en un separador horizontal y padx en uno vertical suele bastar para que la ventana se lea como secciones y no como una lista.
Cuándo el separador no es la respuesta
Si los widgets de los dos lados van juntos y la línea está para decirlo, un LabelFrame declara la agrupación abiertamente y además le pone nombre. Deja el separador para cuando quieras un corte sin ningún nombre asociado.
Hacerlo sin buscarlo
Arrastra un Separator y dale un ancho en el lienzo: como el diseñador coloca los widgets de forma absoluta, ya tiene largo, así que el problema del separador invisible no puede pasar. La orientación es un desplegable del inspector.
Diseña la ventana visualmente y ve el código Python generado sobre la marcha.
Abrir el diseñador de tkinter →