Curso Python. Volumen XIV: Interfaces Gráficas. Parte II

Escrito por Javier Ceballos Fernández

Bienvenidos un día más al curso de Python, hoy continuaremos hablando sobre las interfaces gráficas, añadiendo eventos para que nuestros elementos puedan interactuar con el usuario. Así que pongámonos manos a la obra y empecemos esta nueva entrega.

En el capítulo anterior os enseñamos como crear los elementos de la interfaz, y como posicionarlos en la pantalla, a continuación os mostraremos como asociar los eventos a nuestros elementos.

Callbacks

Los “callbacks” son los eventos asociados con un código de ejecución. La forma de hacerlo es pasando una función (realmente cualquier objeto con un método “__call__”) en la opción “command”. En un primer momento aparece una restricción. Esta restricción consiste en que no se pueden pasar argumentos con la función, ya que en el caso de aportarlos la función se ejecuta cuando el botón es creado y no cuando capta una pulsación.

Sin embargo hay varias formas de conseguir pasar parámetros:

  1. Usando funciones anónimas con la instrucción “lambda”. Básicamente, consiste en diferir la llamada creando una función intermedia que pasamos en la opción “command”. (El valor de los parámetros son fijados en el tiempo de construcción de la interfaz gráfica y no en tiempo de ejecución)
Button(text='PRESS', command = lambda(print(“abc”)))

Un resultado similar se puede conseguir con una sentencia def.

def g():
    print(“abc”)

Button(text='PRESS', command = g)
  1. Usando variables globales. Aunque siempre es mejor utilizar parámetros debido a que son locales y más fáciles de seguir en un programa.
  2. Métodos ligados. Nos encontraríamos ya en programación orientada a objetos. En este caso se suministra en la opción “command” un método de la clase en el que implícitamente se pasa la instancia en el argumento “self”. Hay otras formas de capturar eventos además de la opción “command”.El método “bind” captura eventos a un nivel más básico, como una pulsación simple o un doble click, etc.

A continuación exponemos un ejemplo sobre lo explicado:

from tkinter import *

class MyFirstGUI:
    def __init__(self, master):
        self.master = master
        master.title("GUI simple")

        self.label = Label(master, text="Primera ventana!")
        self.label.pack()

        self.greet_button = Button(master, text="Hola Mundo", command=self.greet)
        self.greet_button.pack()

        self.close_button = Button(master, text="Close", command=master.quit)
        self.close_button.pack()

    def greet(self):
        print("Hola Mundo!!!")

root = Tk()
my_gui = MyFirstGUI(root)
root.mainloop()
  1. Clases con un método “__call__”. Este método hace que las instancias de la clase puedan ser llamadas igual que una función pero con el plus de tener disponible todo el objeto con sus atributos y estado.

Personalizando widgets con clases

Podemos utilizar clases para personalizar los widgets, esto nos permite:

  • Personalizar los widgets usando la propiedad de herencia.
  • Crear una estructura fácilmente reutilizable en otros proyectos.

A continuación os dejamos un ejemplo de código en el cual se construye una interfaz gráfica para el programa de generación de combinaciones de la Primitiva. Lo hemos realizado con programación orientada a objetos y hemos usado la clase “Frame” de la biblioteca de “tkinter”.

import random
from tkinter import *

class Primitiva(Frame):
    def __init__(self, parent=None, **kargs):
        Frame.__init__(self, parent, **kargs)
        self.pack()
        self.construccion()
        self.iteracion = 0 # estado

    def construccion(self):
        Label(self, text=
            'Pulsa el boton para generar una combinacion.').pack()
        self.label = Label(self, text='Combinacion', width=50)
        self.label.pack(side='left')
        Button(self, text='Nueva', command=self.sorteo).pack()

    def combinacion(self):
        numeros = random.sample(range(1,99),6)
        numeros.sort()
        complementarios = random.sample(range(1,99),1)
        joker = random.sample(range(1000000,9999999),1)
        reintegro = random.sample(range(1,99),1)
        return (str(numeros).strip('[]')+'  C: ' +
            str(complementarios).strip('[]') + '   Joker: '+ str(joker).strip('[]')+'   Reintegro: '+ str(reintegro).strip('[]'))

    def sorteo(self):
        self.iteracion += 1 # actualiza el numero de iteraciones
        self.label.configure(text = self.combinacion())


if __name__ == '__main__':
    Primitiva().mainloop()

Esto es todo por hoy, con lo explicado podéis empezar a crear vuestras propias aplicaciones basadas en interfaces gráficas, la biblioteca “tkinter” da muchísimas posibilidades, os invito a que la miréis y comprobéis todo lo que os permite hacer.

Y para todos los que se acaban de incorporar indicarles que tenemos un índice con todos los capítulos del curso, ya que nunca es tarde para empezar.

Últimos análisis

Valoración RZ
7
Valoración RZ
9
Valoración RZ
8
Valoración RZ
8
Valoración RZ
8
Valoración RZ
8
Valoración RZ
10