Search code examples
pythonwidgetpygtk

How to use the same widget twice in pygtk?


This doesn't work well:

    image_log = gtk.Image()
    image_log.set_from_file("test.png")

    self.out_button = gtk.Button()
    self.out_button.add(image_log)

    self.err_button = gtk.Button()
    self.err_button.add(image_log)

    another_box.pack_start(self.out_button, False)
    another_box.pack_start(self.err_button, False)

The problem is, image_log is used twice and GTK doesn't like it. Is there some .copy() method? Or should I just use plain vanilla deepcopy?

EDIT: Looks like there is no default way to clone objects in GTK. Factory will do the trick in this case.

GTK warning:

app/gui.py:248: GtkWarning: gtk_box_pack: assertion `child->parent == NULL' failed
hbox_errlog.pack_start(image_log)

Solution

  • You could use a factory function to reduce code duplication

    def make_image_from_file(fname):
      im = gtk.Image()
      im.set_from_file(fname)
      return im
    
    self.out_button.set_image(make_image_from_file(..))
    

    Revisiting

    There is a much more natural way. You will like it. In PyGTK 2.12+:

    gtk.image_new_from_file(filename)
    

    I had something in the back of my mind telling me this, but I didn't look it up.

    http://www.pygtk.org/docs/pygtk/class-gtkimage.html#function-gtk--image-new-from-file