[pygtk] widget containers for free placement
Greg Ewing
greg.ewing at canterbury.ac.nz
Sun Oct 28 10:47:15 WST 2007
Here's a version that will let you drag the RedBox around.
(I don't have Cairo installed, so I changed it to use the
normal gtk drawing methods.)
--
Greg
-------------- next part --------------
import gtk
import math
class Thing(gtk.DrawingArea):
def __init__(self):
super(Thing, self).__init__()
self.add_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK |=
gtk.gdk.POINTER_MOTION_MASK)
self.connect("expose_event", self.expose)
self.connect("button_press_event", self.click)
self.connect("motion_notify_event", self.drag)
self.connect("button_release_event", self.release)
self.click_point =3D None
print "Thing __init__ called"
def expose(self, widget, event):
print "Thing expose called"
context =3D None
###context =3D widget.window.cairo_create()
# set a clip region for the expose event
###context.rectangle(event.area.x, event.area.y,
### event.area.width, event.area.height)
###context.clip()
self.draw(context)
return False
=
def click(self, widget, event):
self.click_point =3D event.get_coords()
print "Thing.click at", self.click_point
=
def drag(self, widget, event):
if self.click_point:
x0, y0 =3D self.click_point
x1, y1 =3D event.get_coords()
print "Thing.drag:", (x1, y1)
dx =3D x1 - x0
dy =3D y1 - y0
x, y =3D self.parent.child_get(self, 'x', 'y')
self.parent.move(self, x + dx, y + dy)
=
def release(self, widget, event):
print "Thing.release"
self.click_point =3D None
def draw(self, context):
pass
=
def rect(self):
return self.get_allocation()
class RedBox(Thing):
def draw(self,context):
print "RedBox.draw" ###
x, y, w, h =3D self.rect()
win =3D self.window
colormap =3D self.get_colormap()
red =3D colormap.alloc_color("red")
gc =3D win.new_gc(foreground =3D red)
win.draw_rectangle(gc, True, 0, 0, w, h)
###context.set_source_rgb(1, 0, 0)
###context.rectangle(20, 20, 50, 50)
###context.fill()
def main():
window =3D gtk.Window()
window.set_size_request(400, 400)
window.connect('delete-event', gtk.main_quit)
sw =3D gtk.Layout()
window.add(sw)
sw.set_size(400, 400)
#sw.set_size_request(300, 300)
rb =3D RedBox()
rb.set_size_request(100, 100)
sw.add(rb)
sw.move(rb, 50, 60)
=
rb.show()
sw.show()
=
window.show_all()
gtk.main()
=
if __name__ =3D=3D "__main__":
main()
More information about the pygtk
mailing list