2011-04-10 9 views
7

Estoy usando un contenedor personalizado donde necesito reordenar widgets pero no hay métodos para hacerlo. Así que traté de eliminar todos los widgets y agregarlos nuevamente en orden.Pygtk: elimine un widget de un contenedor y vuelva a utilizarlo más tarde

El problema es que esto no está funcionando bien, no puedo ver los widgets después de volver a agregarlos, supongo que lo que sucede es que cuando elimino los widgets no se realizan.

¿Hay alguna forma de eliminar un widget y reutilizarlo más tarde?

Respuesta

6

El pygtk docs proporciona un poco de información.

Nota que el contenedor posee una referencia a widget, y que esto puede ser la última referencia es titular; entonces eliminando un widget de su contenedor puede causar que ese widget sea destruido. Si desea utilizar el widget nuevamente, debería agregar una referencia al mismo.

ediciones

acabo rápidamente de pygtk modificado Hello World para añadir/quitar/cambiar el orden de los widgets en un recipiente. Esto funciona porque el botón1 es una variable miembro de la clase, nunca sale del alcance.

#!/usr/bin/env python 

# example helloworld2.py 

import pygtk 
pygtk.require('2.0') 
import gtk 

class HelloWorld2: 

    # Our new improved callback. The data passed to this method 
    # is printed to stdout. 
    def callback_remove(self, widget, data): 
    self.box1.remove(self.button1); 

    def callback_add(self, widget, data): 
     self.box1.pack_start(self.button1, True, True, 0) 

    # another callback 
    def delete_event(self, widget, event, data=None): 
     gtk.main_quit() 
     return False 

    def __init__(self): 
     # Create a new window 
     self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 

     # This is a new call, which just sets the title of our 
     # new window to "Hello Buttons!" 
     self.window.set_title("Hello Buttons!") 

     # Here we just set a handler for delete_event that immediately 
     # exits GTK. 
     self.window.connect("delete_event", self.delete_event) 

     # Sets the border width of the window. 
     self.window.set_border_width(10) 

     # We create a box to pack widgets into. This is described in detail 
     # in the "packing" section. The box is not really visible, it 
     # is just used as a tool to arrange widgets. 
     self.box1 = gtk.HBox(False, 0) 

     # Put the box into the main window. 
     self.window.add(self.box1) 

     # Creates a new button with the label "Button 1". 
     self.button1 = gtk.Button("Button 1") 

     # Now when the button is clicked, we call the "callback" method 
     # with a pointer to "button 1" as its argument 
     self.button1.connect("clicked", self.callback_remove, "button 1") 

     # Instead of add(), we pack this button into the invisible 
     # box, which has been packed into the window. 
     self.box1.pack_start(self.button1, True, True, 0) 

     # Always remember this step, this tells GTK that our preparation for 
     # this button is complete, and it can now be displayed. 
     self.button1.show() 

     # Do these same steps again to create a second button 
     self.button2 = gtk.Button("Button 2") 

     # Call the same callback method with a different argument, 
     # passing a pointer to "button 2" instead. 
     self.button2.connect("clicked", self.callback_add, "button 2") 

     self.box1.pack_start(self.button2, True, True, 0) 

     # The order in which we show the buttons is not really important, but I 
     # recommend showing the window last, so it all pops up at once. 
     self.button2.show() 
     self.box1.show() 
     self.window.show() 

def main(): 
    gtk.main() 

if __name__ == "__main__": 
    hello = HelloWorld2() 
    main() 
+0

Sí leí esa información, pero no sé si puedo agregar referencias manualmente a mi widget. El widget sigue siendo referenciado por python pero no por GTK. – pmoleri

+0

@pmoleri, acabo de agregar un ejemplo rápido y sucio. Puede eliminar y volver a agregar widgets a un contenedor (un HBox) con bastante facilidad. Al hacer clic en "Botón 1", se eliminará y luego, al hacer clic en "Botón 2", se agregará al final del contenedor. Creo que "agregar una referencia" solo significa que no puedes dejarlo fuera del alcance. – Mark

1

acaba de establecer propiedad de visibilidad del widget en False, y la pusieron en True después, con el método set_visible.

1

no se necesitan sólo widgrt.its objetos no visibles need.then debe no sólo se used.it ocultar memmory graphicaly.but todavía no depurados

función Remove es la respuesta

Cuestiones relacionadas