La capa de interfaz gráfica (tkinter)

A continuación se presenta el listado íntegro del módulo que implementa la capa de datos.

Figura 1. La interfaz tkinter

from Tkinter import *

class agendatk:
    def __init__(self,tipo_bd):
        #Nuestra capa de BD es una clase que nos pasan en el constructor
        self.db=tipo_bd()
        #Contruimos el interfaz gráfico
        self.r=Tk()
        self.t=Entry(self.r)
        self.t.pack()
        self.res=Label(self.r,text='Sin resultados')
        self.res.pack()
        Button(self.r,text='Buscar',command=self.busca).pack()
        Button(self.r,text='Encontrar',command=self.encuentra).pack()

    def run(self):
        self.r.mainloop()

    def busca(self):
        texto=self.t.get()
        ret=self.db.busca(texto) or []
        for elem in ret:
            texto = texto + '\n%s = %s - %s ' % (elem[0] , elem[1][0], elem[1][1])
        self.res.configure(text=texto)
        
    def encuentra(self):
        texto=self.t.get()
        ret=self.db.encuentra(texto)
        self.res.configure(text='%s - %s' % ret)

if __name__=='__main__':
    import agendadb
    agtk=agendatk(agendadb.agenda)
    agtk.run()

    

Comentarios al listado

En Python es posible pasar casi cualquier cosa como parámetro: Una variable simple, un objeto cualquiera, atributos de un método, funciones, métodos, módulos, clases... Además, el modo de hacerlo es el más intuitivo posible. En este caso estamos pasando una clase de acceso a datos al constructor de nuestra interfaz y las funciones de respuesta a los sucesos.

No hay nada privado ni protegido en Python. Todos los atributos de una clase y sus métodos son públicos. Esto fomenta la cooperatividad entre colaboradores y elimina horas de trabajo empleadas en decidir qué es publico o privado, y en permitir acceso a valores privados.

La interfaz tkinter está fuertemente basada en tcl/tk, hasta el punto de que lo utiliza internamente. Por supuesto, esto provoca un descenso en el rendimiento, pero es inapreciable en la mayoría de las aplicaciones, como en ésta. Si se conoce tcl/tk, todo el conocimiento de construcción de interfaces es inmediatamente aplicable a tkinter. Tan sólo hay que hacer la traducción inmediata a Python. En Python se pueden realizar interfaces gráficas con wxWindows, la más pujante, con swing y awt en el caso de Jython y otras menos conocidas.

Vemos que se importa el módulo agendadb (el módulo de acceso a datos creado antes) sólo si es ése el que vamos a utilizar. En el caso del módulo realizando sus funciones de auto-prueba (ejecutándose de manera autónoma), utilizamos este acceso a datos por la sencilla razón de que es el único que tenemos hasta ahora. En otras palabras, no hace falta que el módulo agendadb esté disponible si disponemos de otro módulo de acceso a datos que sea conforme a la interfaz (no definida explícitamente, sino por su uso) de agendadb.