jueves, 12 de marzo de 2020

Tkinter - de marciano a humano - sección 2 - Una aplicación mínima


Sección 2 - Una aplicación mínima

La semana anterior en la sección 1 vimos la generador de interfaz gráfica de usuario multiplataforma para Python, en esta ocación veamos la forma de hacer una ventana básica, este pequeño programa solamente contiene un botón para salir:

Crearemos un archivo prototipo001.py y dentro del mismo colocaremos el siguiente código:
(cambienle el autor si quieren...)

01 #!/user/bin/env python
02 #-------------------------------------------------------------------------------
03 # Name: tkinter ejemplo 001
04 # Purpose: El proposito de este script es demostrar las características
05 # básicas de tkinter y llegar a crear interfaces profesionales,
06 # es en parte inspirado en la guía oficial de tkinter 8.5 y con
07 # conocimientos ampliados que luego fueron incorporados a la guía
08 #
09 # Author: Mauricio José Tobares
10 #
11 # Created: 24/01/2020
12 # Copyright: (c) SplinterStudio 2020
13 # Licence: <lo que? licencia? que es eso?>
14 #-------------------------------------------------------------------------------
15
16 from tkinter import *
17 from tkinter import ttk
18
19 # Crea una clase Python para definir el interfaz de usuario de la aplicación.
20 # Cuando se cree un objeto del tipo 'Prototipo1' se ejecutará automáticamente
21 # el método __init__() que construye y muestra la ventana con todos sus widgets
22 class Prototipo1():
23 def __init__(self):
24 'ventana root o raiz'
25 self.root=Tk()
26 'título de la ventana root'
27 tituloVentanaRoot="Prototipo 001"
28 self.root.title(tituloVentanaRoot)
29 ' se coloca el boton de salida'
30 'esto es así porque se destruye a root que es el padre o raiz.'
31 self.botonSalida=ttk.Button(self.root, text='SALIR', command=self.root.destroy)
32 self.botonSalida.grid(row=0, column=0)
33 'se ejecuta el programa'
34 self.root.mainloop()
35
36 # Define la función main() que es en realidad la que indica
37 # el comienzo del programa. Dentro de ella se crea el objeto
38 # aplicación 'mi_app' basado en la clase 'Prototipo1':
39 def main():
40 mi_app=Prototipo1()
41 return 0
42
43 # Mediante el atributo __name__ tenemos acceso al nombre de un
44 # un módulo. Python utiliza este atributo cuando se ejecuta
45 # un programa para conocer si el módulo es ejecutado de forma
46 # independiente (en ese caso __name__ = '__main__') o es
47 # importado:
48 if __name__ == '__main__':
49 main()

ACLARACIÓN: yo se que se ve feo el poner el número de línea, pero este manual va de principiante que no sabe absolutamente nada a contenidos avanzados, por tanto al inicio será muy conveniente colocar el número de la línea!

nuestra pequeña aplicación se ve así:
Por ahora se ve bastante fea... la típica interfaz marciana tan cuestionada por muchos...
Como se puede apreciar hay unas cuantas diferencias entre Python 2.7 y Pythn 3.8.1, principalmente la forma en que se trabajan (con clases), el documento original NO FUNCIONARÁ en las versiones de python 3.x (este ejemplo fue testeado en Python 3.8.1), a lo largo de todo este artículo se trabajaremos solo con Python 3.8.1, seguramente funcionará de igual modo en las versiones anteriores de Python 3.x.

Agregando unos extras

Para comenzar vamos a colocar un logo al proyecto (un pequeño .ico de 128x128 que encontré en una web de iconos gratuitos), lo que se debe hacer es (y como es lógico) pensar a futuro, para ello vamos a crear una carpera llamada “modulos” en la carpeta donde se tiene el script prototipo001.py, dentro de esta carpeta colocaremos una carpeta llamada “img”, y dentro de esta carpeta pondremos nuestro logo.ico. Una ruta posible hacia nuestro pequeño logo sería ./modulos/img/logo.ico

Ahora bien, vamos a los códigos, en primer lugar colocaremos a continuación de la línea n° 28 el siguiente código:

28           self.root.title(tituloVentanaRoot) # dejo este renglon solo para referencia
29           'con esto colocamos el logo personalizado de la ventana root'
30           try:
31               'el icono DEBE ser .ico de lo contrario no funcionara'
32               self.root.iconbitmap('./modulos/img/logo.ico') # ATENCION: Cuidado con la ruta del ícono!!
33           except TclError:
34               'imprime este mensaje si el icono no se encuentra o no pudo ser cargado'
35               print("ERROR: El icono de la ventana no pudo ser cargado")
36               pass
El resultado se verá así:
Pueden poner cualquier logo... yo puse ese porque es lo que encontré!!

Ahora le agrego una forma de maximizar la ventana al tamaño que tenga el usuario, aporte que se agradece pues la mayoría de los programas comienzan maximizados (o al menos esa debería ser la regla general)
NOTA IMPORTANTE:
Es siempre recomendable que a la ventana padre se la llame “root”, ya que la gran mayoría de los programadores así le llama a la raiz de sus aplicaciones, en nuestro caso la ventana padre.

Siguiendo el mismo procedimiento de agregar código colocaremos a partir de la línea n° 25 lo siguiente:

25        self.root=Tk()
26        'lo siguiente hace que la ventana root inicie maximizada'
27        toplevel=self.root.winfo_toplevel()
28        toplevel.wm_state('zoomed')

No voy a profundizar mucho en detalles porque seguidamente se van a explicar algunos conceptos.

Hasta el próximo jueves, salud y saludos!
Mauricio José Tobares

No hay comentarios:

Publicar un comentario

TkInter - de marciano a humano - sección 13 - El Widget LabelFrame

  13 El widget LabelFrame El widget LabelFrame al igual que el widget Frame es un contenedor espacial, un área rectangular que puede...