Esta receta explica cómo usar la clase GladeWrapper para hacer programas PyGTK más sencillos que nunca.
La clase GladeWrapper que propongo aquí es una forma de simplificar la carga y acceso de widgets GTK con glade. No es la única ni la primera pero creo que es lo suficientemente potente a la vez que sencilla comparada con otras implementaciones similares.
Se trata de una clase abstracta, es decir, no está pensada para ser instanciada sino para heredar de ella. La clase en cuestión es ésta:
class GladeWrapper: def __init__(self, glade_file, root_widget=None): self.__glade = gtk.glade.XML(glade_file, root_widget) self.__glade.signal_autoconnect(self) def get_widget(self, name): return self.__glade.get_widget(name) def __getattr__(self, name): try: return self.__dict__[name] except KeyError, e: if name.startswith("wg_"): try: ret = self.__glade.get_widget(name[3:]) except AttributeError: raise AttributeError("You must call GladeWrapper.__init__() in your derived class") if ret: self.__dict__[name] = ret return ret raise AttributeError, "%s: %s" % (str(self.__class__), e)
Al sobreescribir el método __getattr__() se puede referenciar un widget como si fuera un atributo del objeto que implemente esta clase. A pesar de eso, dispone de un método get_widget() por si fuera necesario acceder a un widget del que se tiene su nombre como cadena, aunque eso no es lo habitual.
También notar que para acceder a un widget hay que poner “wg_” antes del nombre que le hayas dado en el .glade, Eso simplifica las cosas porque, de otro modo, al escribir mal el nombre de un atributo del objeto, el gladewrapper “pensaría” que te refieres a un widget; además es habitual usar atributos que se llaman igual que los widgets con los que tienen relación.
Para entender realmente la utilidad de esta clase lo más fácil es ver un ejemplo. El siguiente programa necesita el fichero gui.glade (creado con “glade”) para poder funcionar.
import gtk from gladewrapper import GladeWrapper class Application(GladeWrapper): def __init__(self): GladeWrapper.__init__(self, 'gui.glade') self.wg_window.connect('destroy', gtk.main_quit) def on_button_clicked(self, button): self.wg_entry.set_text('¡Ejemplo mínimo!') app = Application() gtk.main()
Si alguien sabe cómo hacerlo más fácil que lo diga, por favor; a mí no se me ocurre…





Comentarios recientes
hace 1 semana 1 día
hace 1 semana 2 días
hace 1 semana 2 días
hace 1 semana 5 días
hace 1 semana 5 días
hace 1 semana 5 días
hace 1 semana 5 días
hace 1 semana 5 días
hace 1 semana 5 días
hace 1 semana 5 días