Widgets Personalizados con Tkinter y Python

Personalizando métodos de nuestras clases en Python 


Hay veces que nos encontramos con la tarea de crear widgets personalizados con Tkinter y Python, y en ocasiones nos encontramos con el caso de que creamos una clase para nuestro nuevo widget, que hereda de algunos de los widgets que vienen por defecto en Tkinter, como Text, Label, etc, pero el contenedor o marco que usamos es un Frame.

Entonces, al queres usar esa clase que creamos, y usamos los métodos de Pack, Grid, o Place, no se pasan a nuestro contenedor Frame, sino a nuestra clase. De modo que podemos tener problemas cuando intentamos colocarlo en el lugar que queremos, y después usar los otros métodos y atributos, pero que no se pasen al Frame, sino al nuestro Text, por ejemplo.

Algo que puede ayudarnos en ese momento es el siguiente trozo de código, que lo leí en un libro y que después lo empezé a copiar de la librería "idlelib" de Tkinter.

El código es como sigue.

Para Python 3:

text_meths = vars(Text).keys()
print(text_meths)

methods = vars(Pack).keys() | vars(Grid).keys() | vars(Place).keys()
methods = set(methods).difference(text_meths)

for m in methods:
    if m[0] != '_' and m != 'config' and m != 'configure':
        setattr(self, m, getattr(self.frame, m))

Para Python 2:

text_meths = vars(Text).keys()
print(text_meths)

methods = vars(Pack).keys() + vars(Grid).keys() + vars(Place).keys()
methods = set(methods).difference(text_meths)

for m in methods:
    if m[0] != '_' and m != 'config' and m != 'configure':
        setattr(self, m, getattr(self.frame, m))


En este caso, Text es la clase de la que hereda la nuestra, y el self.frame, es nuestro widget contenedor.

Este código puede ir al final del método __init__() de nuestra clase.

Espero que les pueda ser de utilidad.

Comentarios