[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