Johannes Zellner wrote:
On Wed, Aug 04, 2004 at 10:41:52AM -0300, Christian Robottom Reis wrote:I hacked up the tut demo and got the attached that seems to work though somewhat jerkily.
On Wed, Aug 04, 2004 at 03:38:08PM +0200, Johannes Zellner wrote:
the rulers ARE the difficult part! w/o any rulers, it's easy.Why not put rulers and canvas inside the scrolledwindow?
The painful thing is to size and scroll the rulers simulaneously
with the drawingarea (which can be placed inside a scrolledwindow).
because then the rulers will be scrolled away. I've attached an approach, which shows how it should look like (but which doesn't work correctly). There the drawingarea is about 600 x 400 pixels large, but the viewport is only about 280 x 280 pixels. Note that the rulers were scrolled correctly to match the visible part of the drawingarea (the rulers start at about 80 and not zero).
As I've said, the pygtk code which produced the screenshot
doesn't work quite correctly and I thought that there must
be already some code which does the job.
John
#!/usr/bin/env python
# example drawingarea.py import pygtk pygtk.require('2.0') import gtk import operator import time import string class DrawingAreaExample: def __init__(self): window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.set_title("Drawing Area Example") window.connect("destroy", lambda w: gtk.main_quit()) self.area = gtk.DrawingArea() self.area.set_size_request(400, 300) self.pangolayout = self.area.create_pango_layout("") self.sw = gtk.ScrolledWindow() self.sw.add_with_viewport(self.area) self.table = gtk.Table(2,2) self.hruler = gtk.HRuler() self.vruler = gtk.VRuler() self.hruler.set_range(0, 400, 0, 400) self.vruler.set_range(0, 300, 0, 300) self.table.attach(self.hruler, 1, 2, 0, 1, yoptions=0) self.table.attach(self.vruler, 0, 1, 1, 2, xoptions=0) self.table.attach(self.sw, 1, 2, 1, 2) window.add(self.table) self.area.set_events(gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK ) self.area.connect("expose-event", self.area_expose_cb) def motion_notify(ruler, event): return ruler.emit("motion_notify_event", event) self.area.connect_object("motion_notify_event", motion_notify, self.hruler) self.area.connect_object("motion_notify_event", motion_notify, self.vruler) self.hadj = self.sw.get_hadjustment() self.vadj = self.sw.get_vadjustment() def val_cb(adj, ruler, horiz): if horiz: span = self.sw.get_allocation()[3] else: span = self.sw.get_allocation()[2] l,u,p,m = ruler.get_range() v = adj.value ruler.set_range(v, v+span, p, m) while gtk.events_pending(): gtk.main_iteration() self.hadj.connect('value-changed', val_cb, self.hruler, True) self.vadj.connect('value-changed', val_cb, self.vruler, False) def size_allocate_cb(wid, allocation): x, y, w, h = allocation l,u,p,m = self.hruler.get_range() m = max(m, w) self.hruler.set_range(l, l+w, p, m) l,u,p,m = self.vruler.get_range() m = max(m, h) self.vruler.set_range(l, l+h, p, m) self.sw.connect('size-allocate', size_allocate_cb) self.area.show() self.hruler.show() self.vruler.show() self.sw.show() self.table.show() window.show() def area_expose_cb(self, area, event): self.style = self.area.get_style() self.gc = self.style.fg_gc[gtk.STATE_NORMAL] self.draw_point(10,10) self.draw_points(110, 10) self.draw_line(210, 10) self.draw_lines(310, 10) self.draw_segments(10, 100) self.draw_rectangles(110, 100) self.draw_arcs(210, 100) self.draw_pixmap(310, 100) self.draw_polygon(10, 200) self.draw_rgb_image(110, 200) return gtk.TRUE def draw_point(self, x, y): self.area.window.draw_point(self.gc, x+30, y+30) self.pangolayout.set_text("Point") self.area.window.draw_layout(self.gc, x+5, y+50, self.pangolayout) return def draw_points(self, x, y): points = [(x+10,y+10), (x+10,y), (x+40,y+30), (x+30,y+10), (x+50,y+10)] self.area.window.draw_points(self.gc, points) self.pangolayout.set_text("Points") self.area.window.draw_layout(self.gc, x+5, y+50, self.pangolayout) return def draw_line(self, x, y): self.area.window.draw_line(self.gc, x+10, y+10, x+20, y+30) self.pangolayout.set_text("Line") self.area.window.draw_layout(self.gc, x+5, y+50, self.pangolayout) return def draw_lines(self, x, y): points = [(x+10,y+10), (x+10,y), (x+40,y+30), (x+30,y+10), (x+50,y+10)] self.area.window.draw_lines(self.gc, points) self.pangolayout.set_text("Lines") self.area.window.draw_layout(self.gc, x+5, y+50, self.pangolayout) return def draw_segments(self, x, y): segments = ((x+20,y+10, x+20,y+70), (x+60,y+10, x+60,y+70), (x+10,y+30 , x+70,y+30), (x+10, y+50 , x+70, y+50)) self.area.window.draw_segments(self.gc, segments) self.pangolayout.set_text("Segments") self.area.window.draw_layout(self.gc, x+5, y+80, self.pangolayout) return def draw_rectangles(self, x, y): self.area.window.draw_rectangle(self.gc, gtk.FALSE, x, y, 80, 70) self.area.window.draw_rectangle(self.gc, gtk.TRUE, x+10, y+10, 20, 20) self.area.window.draw_rectangle(self.gc, gtk.TRUE, x+50, y+10, 20, 20) self.area.window.draw_rectangle(self.gc, gtk.TRUE, x+20, y+50, 40, 10) self.pangolayout.set_text("Rectangles") self.area.window.draw_layout(self.gc, x+5, y+80, self.pangolayout) return def draw_arcs(self, x, y): self.area.window.draw_arc(self.gc, gtk.FALSE, x+10, y, 70, 70, 0, 360*64) self.area.window.draw_arc(self.gc, gtk.TRUE, x+30, y+20, 10, 10, 0, 360*64) self.area.window.draw_arc(self.gc, gtk.TRUE, x+50, y+20, 10, 10, 0, 360*64) self.area.window.draw_arc(self.gc, gtk.TRUE, x+30, y+10, 30, 50, 210*64, 120*64) self.pangolayout.set_text("Arcs") self.area.window.draw_layout(self.gc, x+5, y+80, self.pangolayout) return def draw_pixmap(self, x, y): pixmap, mask = gtk.gdk.pixmap_create_from_xpm( self.area.window, self.style.bg[gtk.STATE_NORMAL], "gtk.xpm") self.area.window.draw_drawable(self.gc, pixmap, 0, 0, x+15, y+25, -1, -1) self.pangolayout.set_text("Pixmap") self.area.window.draw_layout(self.gc, x+5, y+80, self.pangolayout) return def draw_polygon(self, x, y): points = [(x+10,y+60), (x+10,y+20), (x+40,y+70), (x+30,y+30), (x+50,y+40)] self.area.window.draw_polygon(self.gc, gtk.TRUE, points) self.pangolayout.set_text("Polygon") self.area.window.draw_layout(self.gc, x+5, y+80, self.pangolayout) return def draw_rgb_image(self, x, y): b = 80*3*80*['\0'] for i in range(80): for j in range(80): b[3*80*i+3*j] = chr(255-3*i) b[3*80*i+3*j+1] = chr(255-3*abs(i-j)) b[3*80*i+3*j+2] = chr(255-3*j) buff = string.join(b, '') self.area.window.draw_rgb_image(self.gc, x, y, 80, 80, gtk.gdk.RGB_DITHER_NONE, buff, 80*3) self.pangolayout.set_text("RGB Image") self.area.window.draw_layout(self.gc, x+5, y+80, self.pangolayout) return def main(): gtk.main() return 0 if __name__ == "__main__": DrawingAreaExample() main()
_______________________________________________ pygtk mailing list [EMAIL PROTECTED] http://www.daa.com.au/mailman/listinfo/pygtk Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/