[pygtk] Creating a CellRenderer that takes EventBoxes

Geoffrey Gallaway geoffeg at gmail.com
Thu Mar 27 06:32:52 WST 2008


Hello,

I'm trying to create an application that will display a grid of images
and allow the user to click on those images to perform an action. It
didn't look like there was a way to do this with the built-in
CellRenderers so I started creating my own. I don't think I'm
completely understanding how the cell renderer on_render method is
supposed to work.

How do I get the on_render method to render the eventbox (which
doesn't actually render anything) and then get the eventbox itself to
render the image?

Here's the relevant code I have so far:

    renderer = CellRendererEventBoxImage()
    column = gtk.TreeViewColumn('Fixed', renderer, eventBoxImage=1)
    column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
    column.set_fixed_width(50)
    grid.append_column(column)
    grid.show()
    self.window.add(grid)
    self.window.show_all()

    for image in self.images:
      gtkImg = gtk.Image()
      pilimage = Image.open(IMAGES_DIRECTORY + image)
      pilimage.thumbnail([256,256])
      gtkImg.set_from_pixbuf(get_pixbuf_from_pil(pilimage))
      eventBox = gtk.EventBox()
      eventBox.add(gtkImg)
      eventBox.add_events(gtk.gdk.BUTTON_PRESS_MASK)
      eventBox.connect("button_press_event", imgClicked)
      iter = data_store.append()
      data_store.set(iter, 0,  'test', 1, eventBox)


class CellRendererEventBoxImage(gtk.GenericCellRenderer):
### __init__, do_set_property, do_get_property, func and
__gproperties__ omitted for clarity and brevity
   def on_render(self, window, widget, background_area,cell_area,
expose_area, flags):
      if not self.eventBoxImage:
         return
      pix_rect = gtk.gdk.Rectangle()
      pix_rect.x, pix_rect.y, pix_rect.width, pix_rect.height =
self.on_get_size(widget, cell_area)

      pix_rect.x += cell_area.x
      pix_rect.y += cell_area.y
      pix_rect.width  -= 2 * self.get_property("xpad")
      pix_rect.height -= 2 * self.get_property("ypad")

      draw_rect = cell_area.intersect(pix_rect)
      draw_rect = expose_area.intersect(draw_rect)

      img = self.eventBoxImage.get_child()
      if img.get_storage_type() == gtk.IMAGE_PIXBUF:
         pix = img.get_pixbuf()
      else:
         return
      widget.style.paint_box(window, gtk.STATE_NORMAL, gtk.SHADOW_OUT,
cell_area, \
          self.eventBoxImage, None, draw_rect.x-pix_rect.x,
draw_rect.y-pix_rect.y, \
          draw_rect.width, draw_rect.height)

Thanks,
Geoff


More information about the pygtk mailing list