Pygtk: remove the widget from the container and reuse it later.

I use a custom container where I need to reorder widgets, but there are no methods for this. So I tried to remove all the widgets and add them in order.

The problem is that this does not work, I donโ€™t see widgets after adding them again, I think what happens when I delete widgets, they become unrealized.

Is there a way to remove the widget for reuse later?

+7
source share
3 answers

pygtk docs give a little insight.

Please note that the container will have a link to the widget, and this may be the last link; so removing the widget from the container can destroy the widget. If you want to use the widget again, you must add a link to it.

edits

I just quickly modified pygtk Hello World to add / remove / reorder widgets in the container. This works because button1 is a member variable of the class, it never goes beyond.

#!/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() 
+6
source

Just set the widget's visibility property to False and set it later to True using the set_visible method.

+1
source

it does not need only widgrt.its objects that are not needed. Then visible should not be used. It will hide only the graphic. but memmory is still not released

Delete function is the answer

+1
source

All Articles