Python/Interfaz gráfica con Tkinter/Gestión de ventanas
Métodos
editarLos siguiente métodos nos darán la posibilidad de personalizar al máximo nuestra aplicación y cada una de sus ventanas
iconify
editar- Descripción
- Permite minimizar la ventana que le indiquemos, esto es útil por ejemplo, para minimizar una ventana padre cuando se abre una ventana hija. Lo mejor será verlo con unos ejemplos.
- Argumentos
- No tiene
- Ejemplos
- En este ejemplo usamos el método 'iconify' en un botón para minimizar la ventana cuando se haga click sobre él:
import Tkinter
root = Tkinter.Tk()
boton = Tkinter.Button(root, text="Minimizar", command=root.iconify)
boton.pack()
root.mainloop()
- En este otro ejemplo creamos un botón que abre otra ventana y minimiza la ventana padre
import Tkinter
def funcion():
otra_ventana = Tkinter.Toplevel(root)
root.iconify()
root = Tkinter.Tk()
boton = Tkinter.Button(root, text="Abrir otra ventana", command=funcion)
boton.pack()
root.mainloop()
deiconify
editar- Descripción
- Al contrario de como vimos en 'iconify' que podíamos minimizar la ventana, con 'deiconify' podemos restaurar la ventana, como paso con 'iconify' veámoslo con unos ejemplos
- Argumentos
- No tiene
- Ejemplos
- Esta es una variación de uno de los ejemplos que ya habíamos visto, pero en este cuando hacemos click en el botón 'Minimizar' este se minimiza pero pasado 5 segundos se vuelve a restaurar la ventana.
import Tkinter
import time
def funcion():
root.iconify()
time.sleep(5)
root.deiconify()
root = Tkinter.Tk()
boton = Tkinter.Button(root, text="Minimizar", command=funcion)
boton.pack()
root.mainloop()
title
editar- Descripción
- Permite indicar el título de la ventana. Podría decirse que este valor se hereda ya que si creamos una nueva ventana a través de Toplevel esta tomaría el nombre de la ventana padre.
- Argumentos
- String (Cadena)
- Ejemplos
- Ejemplos simple:
root = Tkinter.Tk()
root.title("Bienvenido a Codigo Python")
root.mainloop()
- Heredando el título de la ventana padre:
root = Tkinter.Tk()
root.title("Bienvenido a Codigo Python")
otra_ventana = Tkinter.Toplevel(root)
root.mainloop()
- Ejemplo de dos ventanas con títulos distintos:
root = Tkinter.Tk()
root.title("Bienvenido a")
otra_ventana = Tkinter.Toplevel(root)
otra_ventana.title("Codigo Python")
root.mainloop()
geometry
editar- Descripción
- Este método es uno, junto con el resto (no hay que desmerecer la función de ninguno), muy importante, ya que nos permitirá indicar tanto el tamaño de la ventana como su posición, esto nos permitirá trabajar con varias ventanas de una forma más prolija y agradable para el usuario si se planifican bien los objetivos y se utilizan las herramientas adecuadas; en este caso hablaremos de 'geometry'.
- Para su utilización tenemos dos posibilidades, una es indicar solo el tamaño de la ventana usando la siguiente forma:
root.geometry("WxH")
- o indicando además del tamaño de la ventana la posición de la misma de la siguiente forma:
root.geometry("WxH±X±Y")
- El ancho y el alto deben ser reemplazados por las letras W y H respectivamente, separadas por una letra 'x' y su valor deberá ser en pixeles, seguido de estos dos pueden ir de manera opcional dos valores mas que indicaran la posición de la ventana en la pantalla donde se deberá indicar estos valores, también en pixeles, para el eje x y el eje y. Una observación que se debe hacer es que los valores que tome tanto el ancho como el alto de la ventana ademas de ser únicamente en pixeles deberán de ser números enteros positivos.
- El significado del signo mas y menos indica que si se le pasa un valor positivo este será contado desde la esquina superior izquierda de la pantalla, en cambio si le pasamos un valor negativo este sera tomado en cuenta partiendo como origen desde la esquina inferior derecha; este es un detalle que hay que tener muy en cuenta cuando deseamos posicionar una ventana.
- Si no le diéramos argumentos nos devolvería la medida y la posición de la ventana.
- Argumentos
- "wxh±x±y"
- Donde las letras tienen este significado:
- w: Ancho de la ventana en pixeles
- h: Alto de la ventana en pixeles
- x: Posición en el eje X
- y: Posición en el eje Y
- Ejemplos
#!/usr/bin/env python
import Tkinter
# Primera ventana con valores positivos
primer_ventana = Tkinter.Tk()
primer_ventana.geometry("300x300+0+0")
# A modo estetico le di un titulo
primer_ventana.title("Posicion x=+0 y=+0")
# Este tambien es estetico y no influye en el uso del metodo
etiqueta = Tkinter.Label(primer_ventana, text="Posicion x=+0 y=+0", width=100, height=100, anchor="center")
etiqueta.pack()
# Segunda ventana con valores negativos
segunda_ventana = Tkinter.Tk()
segunda_ventana.geometry("300x300-0-0")
segunda_ventana.title("Posicion x=-0 y=-0")
etiqueta = Tkinter.Label(segunda_ventana, text="Posicion x=-0 y=-0", width=100, height=100, anchor="center")
etiqueta.pack()
primer_ventana.mainloop()
segunda_ventana.mainloop()
- Como se observa se crean dos ventanas donde a una se le pasa valores positivos y a la otra por el contrario sus valores serán negativos.
- Si no le pasamos ningún argumento nos devolverá el tamaño y la posición de la ventana como vemos a continuación:
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Tkinter
>>> root = Tkinter.Tk()
>>> root.geometry()
'200x200+0+24'
>>> root.geometry("400x400+50+50")
''
>>> root.geometry()
'400x400+50+50'
>>>
maxsize
editar- Descripción
- Establece los valores máximos de la medida de la ventana, tanto su ancho como su alto. Estos valores se entregan en píxeles, siendo el primer valor el ancho y el segundo el largo, aunque el orden de estos valores pueden alterarse como se observa en los ejemplos.
- Argumentos
- (W, H)
- Donde:
- W = Ancho (Width)
- H = Alto (Height)
o tambien de esta forma
(width=W, height=H)
- Ejemplos
root.geometry("300x300")
root.maxsize(400, 600)
root.geometry("300x300")
root.maxsize(height=600, witdh=400)
minsize
editar- Descripción
- Establece los valores mínimos de la medida de la ventana, tanto su ancho como su alto. Estos valores se entregan en píxeles siendo el primer valor el ancho y el segundo el largo, aunque el orden de estos valores puede alterarse como se observa en los ejemplos.
- Argumentos
- (W, H)
- Donde:
- W = Ancho (Width)
- H = Alto (Height)
- o también de esta forma
- (width=W, height=H)
- Ejemplos
root.geometry("300x300")
root.minsize(400, 600)
root.geometry("300x300")
root.minsize(height=600, witdh=400)
state
editar- Descripción
- Podemos cambiar el estado en el que se encuentra la ventana a 'normal', 'iconic' o 'withdraw'. Con la opción 'normal' la ventana se comporta normalmente apareciendo en la ventana, con la opción 'iconic' obtenemos los mismos resultados que el método 'iconify()', minimizando la ventana y por último con 'withdraw' obtendremos, como se imaginarán, el mismo resultado que con 'withdraw' ocultando la ventana.
- Argumentos
- newstate=ESTADO
- Donde ESTADO toma estos valores:
"normal"
"withdraw"
"iconic"
- Ejemplos
import Tkinter
import time
def funcion():
root.state(newstate='withdraw')
time.sleep(5)
root.state(newstate='normal')
root = Tkinter.Tk()
boton = Tkinter.Button(root, text="Probando el metodo state", command=funcion)
boton.pack()
root.mainloop()
resizable
editar- Descripción
- Nos permite indicar si la ventana debe o no poder redimensionarse, ya sea en su ancho o su alto, dándole a sus parámetros 'width'(Ancho) y 'height' (Largo) los valores 'True' o 'False'. Con True habilitamos el redimensionamiento y con False los deshabilitamos. Si estamos usando a su vez los métodos 'minsize' y/o 'maxsize' el valor máximo al cual se pueda redimensionar dependerá de estos dos métodos en caso de existir.
- Argumentos
- (W, H)
- Donde:
- W = Al ancho y puede tomar los valores True o False
- H = Al alto y puede tomar los valores True o False
- o también esta forma:
- (width=W, height=H)
- Ejemplos
- Redimensionar solo el ancho:
root.resizable(width=True, height=False)
- Redimensionar solo el alto:
root.resizable(width=False, height=True)
- Bloquear el redimensionamiento de la ventana:
root.resizable(width=False, height=False)
withdraw
editar- Descripción
- Este método permite ocultar una ventana; la forma que podemos usar para restaurarla es con 'deiconify()' o 'iconify()', o a traves del método 'state' que nos puede resultar más cómodo de usar. No se requiere de ningún argumento para funcionar como sucede tanto con 'deiconify' e 'iconify'.
root.withdraw()
- Argumentos
- No tiene
- Ejemplos
#!/usr/bin/env python
import Tkinter
import time
def funcion():
root.withdraw()
time.sleep(5)
root.deiconify()
root = Tkinter.Tk()
boton = Tkinter.Button(root, text="Probando el metodo withdraw", command=funcion)
boton.pack()
root.mainloop()
transient
editar- Descripción
- Este método lo que permite es hacer que una ventana permanezca siempre encima de otra, si la ventana padre se minimiza la ventana que lleva el método '.transient()' también lo hará y si esta ventana padre se cerrara la ventana hija también se cerraría.
- Argumentos
- Ejemplos
#!/usr/bin/env python
import Tkinter
root = Tkinter.Tk()
root.title("Ventana padre")
# Creamos una ventana hija de root
otra_ventana = Tkinter.Toplevel(root)
otra_ventana.title("Ventana hija")
# Este es solo para decoracion
etiqueta = Tkinter.Label(otra_ventana, text='Este es un ejemplo de transient')
etiqueta.pack()
# Posicionamos las dos ventanas para que sea mas claro el ejemplo
root.geometry("400x400+100+100")
otra_ventana.geometry("200x200+150+150")
# Y ahora si llamamos a este metodo
otra_ventana.transient(root)
root.mainloop()
- Como ven si intentan mover la ventana padre observaran que esta permanece siempre debajo de la ventana hija.