Picon
Gravatar

[PyGtk] Hacer destroy a un widget y cargar otro en su lugar

Hola, estoy haciendo una pequeña interfaz para una aplicación con PyGtk+, prescindiendo de Glade y añadiendo todos los widget necesarios "a pelo".

Mi problema es que una vez creada la interfaz, tengo una barra de menus, donde tengo un widget MenuItem que al ser activado llamara a una retrollamada que quiero que destruya un widget HBox que ocupa el centro de la interfaz y que cargue otro widget HBox con un gtk.Label y un gtk.ComboEntryList. El problema es que parece ser que no obtengo bien la instancia o no consigo que la interfaz lo muestre y refresque los nuevos widgets con show() o realize().

Me gustaría saber si es posible hacer esto y como hacerlo o bien si se puede realizar por algún otro método. (que no sea utilizando Notebook) porque tendria que cargar varias hojas, ya hago esa operación varias veces.

La clase simplificada de mi aplicación es esta (lo importante esta en el método on_activate_generate):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import gtk

class GestyRoute(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
       
        self.set_title('Gesty Route') # + Version
        self.set_default_size(750, 500)
        self.set_position(gtk.WIN_POS_CENTER)
        self.set_gravity(gtk.gdk.GRAVITY_CENTER)
        self.set_border_width(0)
       
        self.connect("delete_event", self.on_delete_event)
        self.connect("destroy_event", self.on_destroy_event)

        self.add(self.__add_content())
        self.show_all()
       
    def __create_menubar(self):

        setting = gtk.ImageMenuItem('Configuración')
        setting.set_image(gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_MENU))
        exit    = gtk.ImageMenuItem('Salir')
        exit.set_image(gtk.image_new_from_stock(gtk.STOCK_QUIT, gtk.ICON_SIZE_MENU))
       
        menu_archive = gtk.Menu()
        menu_archive.append(setting)
        menu_archive.append(exit)

        archive = gtk.MenuItem('Archivo')
        archive.set_submenu(menu_archive)
       
        generate =gtk.MenuItem('Generar')
        generate.connect('activate',self.on_activate_generate)
       
        menu_route = gtk.Menu()
        menu_route.append(generate)
       
        route = gtk.MenuItem('Rutas')
        route.set_submenu(menu_route)

        menubar = gtk.MenuBar()
        menubar.append(archive)
        menubar.append(route)

        return menubar   
   
    def on_activate_generate(self,item):
       # print "RUTA"
        #print self.get_children()[0].get_children()[1].destroy()
        #self.get_children()[0].get_children()[1].pack_start(gtk.Label("HOla"),False,False,0)
        #self.show_now()
        print self.subcontent
        self.subcontent.destroy()
        #print self.subcontent
        #self.subcontent.unrealize()
        print self.subcontent
        #self.subcontent = gtk.VBox(False,0)
        #print self.subcontent
        #self.subcontent = ''
       
        vbox = gtk.VBox(0,False)
        vbox.pack_start(gtk.ComboBoxEntry(),False,False,0)
        vbox.pack_start(gtk.Label("Hola"),False,False,0)
        self.subcontent.pack_start(vbox,False,False,0)
        #self.subcontent = gtk.Label("Hola")
        print self.subcontent
        self.subcontent.show_all() # No se muestra ningun widget
        self.show_all()
   
    def __create_statusbar(self):
        statusbar = gtk.Statusbar()
        context_id = statusbar.get_context_id('statusbar main')
        statusbar.push(context_id,"Barra de estado: Aplicación cargada.")
        return statusbar 
       
    def __add_content(self):
        vbox = gtk.VBox(False, 0)
        vbox = gtk.VBox(False, 0)
        vbox.set_border_width(0)

        self.menubar = self.__create_menubar()
        vbox.pack_start(self.menubar, False, False, 0)
        self.subcontent = self.__create_subcontent_initial()
        vbox.pack_start(self.subcontent, True, True, 0)

        self.statusbar = self.__create_statusbar()
        vbox.pack_end(self.statusbar, False, False, 0)
       
        return vbox
   
    def __create_subcontent_initial(self):
        return gtk.HBox(False,0)
       
    def on_delete_event(self, widget, data = None):
        gtk.main_quit()
        return False

    def on_destroy_event(self, widget, data = None):
        gtk.main_quit()
        return False
       
if __name__ == '__main__':
    try:
        GestyRoute()
        gtk.main()
    except KeyboardInterrupt:
        print "Programa cancelado por teclado."
        import sys
        sys.exit(1)



--
Shakaran
Blog: www.shakaran.es
Mi proyecto de juego de rol online: www.apogeus.es


Gmane