Abrir ventana secundaria Toplevel con tkinter
Qué es Tkinter Toplevel[editar]
Tkinter Toplevel
son las ventanas secundarias de nuestra aplicación gráfica Python con Tkinter. Así como Tkinter Tk
es la ventana principal y en principio sólo debería haber una, Toplevel
es la clase que debemos usar para ventanas secundarias.
Ejemplo con Tkinter Toplevel[editar]
El siguiente código muestra una ventana principal Tk
con un botón. Al pulsar el botón, se abre una ventana secundaria Toplevel
import tkinter as tk
# Función para abrir la ventana secundaria
def open_secondary_window():
secondary_window = tk.Toplevel(root)
secondary_window.title("Ventana Secundaria")
# Una etiqueta por mostrar algo
label = tk.Label(secondary_window, text="Esta es la ventana secundaria")
label.pack(padx=20, pady=20)
if __name__ == '__main__':
# Ventana principal
root = tk.Tk()
root.title("Ventana Principal")
# Botón para abrir la ventana secundaria
button = tk.Button(root, text="Abrir Ventana Secundaria", command=open_secondary_window)
button.pack(padx=20, pady=20)
# Iniciar el bucle principal de la aplicación
root.mainloop()
Vamos a explicarlo.
Ventana principal Tk[editar]
Partimos de que tienes algún conocimiento básico de cómo crear una ventana con Tkinter. Así que poco que comentar en la parte del main del código. Se crea una ventana principal Tk
, se le añade un botón Button
que al pulsarlo llama a una función open_secondary_window()
y se inicial el bucle principal de la aplicación.
Ventana secundaria Toplevel[editar]
La función open_secondary_window()
es la encargada de instanciar y construir la ventana secundaria Toplevel
. El primer paso es instanciarla y ponerle un título
secondary_window = tk.Toplevel(root)
secondary_window.title("Ventana Secundaria")
El siguiente paso, añadirle los widget que queremos que muestre. En este ejemplo sencillo será un Label
con un texto
label = tk.Label(secondary_window, text="Esta es la ventana secundaria")
label.pack(padx=20, pady=20)
Y no es neceario nada más. Al pulsar el botón de la ventana principal se llamará a la función open_secondary_window()
que crea la ventana secundaria. Se visualiza automáticamente en cuanto termine la llamada a open_secondary_window()
.
Ventana Tkinter Toplevel modal[editar]
Por defecto podemos interactuar con la ventana principal mientras está abierta la secundaria. Esto nos permite pulsar el botón repetidas veces y abrir varias ventanas secundarias a la vez. Si no queremos que se pueda interactuar con la ventana principal mientras está abierta la secundaria, debemos llamar a grab_set()
# Si queremos que sea modal
secondary_window.grab_set()
Posición en pantalla de la ventana Toplevel[editar]
Para fijar la posición en pantalla de la ventana Toplevel
debemos llamar a su método geometry
que admite un texto con el siguiente formato
ancho x alto + posicion_x + posicion_y
El formato es sin espacios, los hemos puesto por claridad. Un ejemplo concreto podría ser
600x300+100+50
para una ventana de 600 pixel de ancho, 300 pixels de alto y cuyo centro está en el pixel (100,50) de la pantalla.
Por ejemplo, para centrar esta ventana Toplevel
en pantalla pondríamos el siguiente código
#centrado en pantalla
# Obtener las dimensiones deseadas de la ventana secundaria
ancho_ventana = secondary_window.winfo_reqwidth()
alto_ventana = secondary_window.winfo_reqheight()
# Calcular las coordenadas para centrar la ventana
x = (root.winfo_screenwidth() - ancho_ventana) // 2
y = (root.winfo_screenheight() - alto_ventana) // 2
# Establecer la geometría de la ventana secundaria
secondary_window.geometry(f"{ancho_ventana}x{alto_ventana}+{x}+{y}")
Las llamadas a winfo_reqwidth()
y winfo_reqheight()
nos dan el tamaño requerido por la ventana secundaria. Es importante por tanto hacer estas llamadas después de haber añadido todos los componentes (widget) que necesitemos.
El siguiente bloque calcula la posición (x,y) en la pantalla donde debería estar el centro de nuestra ventana secundaria. Para ello, la ventana principal root
que instanciamos en el ejemplo tiene métodos winfo_screenwidth()
y winfo_screenheight()
para obtener las dimensiones de la pantalla.
Finalmente, con el método geometry()
indicamos dónde colocar la ventana construyendo el texto de parámetro con las variable que hemos calculado. Usamos para ello el formato python f"...."
que reemplazará los {variable}
por los valores de las variables correpondientes.
Mostrar y Ocultar la ventana Toplevel[editar]
Para ocultar la ventana Toplevel podemos llamar a su método withdraw()
o bien a su método iconify
. El primero la oculta sin más. El segundo la minimiza y la tendremos accesible desde la barra de tareas de nuestro sistema operativo.
Para volver a mostrarla, basta llamar al método deiconify()
independientemnte de cómo la hayamos ocultado
<syntaxhighlight lang="python">
- Función para abrir la ventana secundaria
def open_secondary_window():
global secondary_window secondary_window=tk.Toplevel(root) secondary_window.title("Ventana Secundaria") ...
def oculta():
secondary_window.withdraw() # secondary_window.iconify()
def muestra():
secondary_window.deiconify()
</syntaxhighligth>
Hemos hecho secondary_window
global para tener acceso a ella desde las funciones oculta()
y muestra()
.