From 53db3573797d0df57dd95b326343c11a03daf6a4 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Fri, 4 Apr 2008 00:34:00 +0200 Subject: * host/inter: - added virtual coordinates to DrawableCanvas. --- host/inter/drawable.py | 40 ++++++++++++++++++++++++++++++++++++---- host/inter/test/test_drawable.py | 13 +++++-------- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/host/inter/drawable.py b/host/inter/drawable.py index 52f28dd5..f2f0226b 100644 --- a/host/inter/drawable.py +++ b/host/inter/drawable.py @@ -5,7 +5,7 @@ import Tkinter __all__ = ('Drawable', 'DrawableCanvas') class Drawable: - """Define a drawable area with embeded transformations.""" + """Define a drawable area with embedded transformations.""" def __init__ (self, onto): """Initialise the drawable.""" @@ -80,28 +80,60 @@ class Drawable: class DrawableCanvas(Tkinter.Canvas): - """Extend a Tkinter.Canvas to use Drawable on it.""" + """Extend a Tkinter.Canvas to use Drawable on it. User should implement + the draw method.""" + + def __init__ (self, width, height, xorigin, yorigin, master = None, **kw): + """Initialise a DrawableCanvas. The width and height parameters + define the requested drawable area virtual size. The xorigin and + yorigin parameters define origin of the virtual coordinates relative + to the drawable center.""" + Tkinter.Canvas.__init__ (self, master, **kw) + self.__width = width + self.__height = height + self.__xorigin = xorigin + self.__yorigin = yorigin + self.bind ('', self.__resize) + + def __resize (self, ev): + # Compute new scale. + w, h = float (ev.width), float (ev.height) + self.__scale = min (w / self.__width, h / self.__height) + self.__xoffset = w / 2 + self.__xorigin * self.__scale + self.__yoffset = h / 2 - self.__yorigin * self.__scale + # Redraw. + self.draw () def _Drawable__draw_line (self, *p, **kw): + p = self.__coord (*p) return self.create_line (*p, **kw) def _Drawable__draw_polygon (self, *p, **kw): + p = self.__coord (*p) return self.create_polygon (*p, **kw) def _Drawable__draw_circle (self, p, r, **kw): + p, = self.__coord (p) + r = r * self.__scale p1 = (p[0] - r, p[1] - r) p2 = (p[0] + r, p[1] + r) return self.create_oval (p1, p2, **kw) def _Drawable__draw_arc (self, p, r, **kw): + p, = self.__coord (p) + r = r * self.__scale p1 = (p[0] - r, p[1] - r) p2 = (p[0] + r, p[1] + r) for k in ('start', 'extent'): if k in kw: kw = kw.copy () - # Tk is working upside down. - kw[k] = -degrees (kw[k]) + kw[k] = degrees (kw[k]) return self.create_arc (p1, p2, **kw) def _Drawable__delete (self, *list): self.delete (*list) + + def __coord (self, *args): + return [ (i[0] * self.__scale + self.__xoffset, + -i[1] * self.__scale + self.__yoffset) for i in args ] + diff --git a/host/inter/test/test_drawable.py b/host/inter/test/test_drawable.py index ab1f8d05..31200252 100644 --- a/host/inter/test/test_drawable.py +++ b/host/inter/test/test_drawable.py @@ -7,6 +7,7 @@ from math import pi class Test (Drawable): def draw (self): + self.draw_rectangle ((-100, -100), (100, 100), fill = '', outline = 'gray') self.draw_rectangle ((0, 0), (5, 5), fill = 'red') self.draw_rectangle ((20, 20), (50, 50), fill = '', outline = 'blue') self.draw_line ((20, 20), (25, 25), (80, 0), (0, 80), fill = 'green') @@ -17,28 +18,24 @@ class Test (Drawable): class App (DrawableCanvas): def __init__ (self, master = None): - DrawableCanvas.__init__ (self, master) + DrawableCanvas.__init__ (self, 300, 300, 20, 20, master) self.pack (expand = True, fill = 'both') self.test = Test (self) - self.bind ('', self.resize) self.animated = False self.i = 0 def animate (self): + # Real user should reset at each redraw. self.after (500, self.animate) + self.test.draw () self.test.trans_rotate (-pi/12) self.test.trans_translate ((10, 10)) self.test.trans_scale (1.05) - self.test.trans_translate ((self.w / 2, self.h / 2)) - self.test.draw () - self.test.trans_translate ((-self.w / 2, -self.h / 2)) self.i += 1 if self.i == 10: self.test.reset () - def resize (self, ev): - self.w, self.h = ev.width, ev.height - self.test.reset () + def draw (self): if not self.animated: self.animate () self.animated = True -- cgit v1.2.3