[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