blob: cba22d1a095d64473a39469e13ab4018d60d73ae [file] [log] [blame]
Guido van Rossum18468821994-06-20 07:49:28 +00001# This module exports classes for the various canvas item types
2
Guido van Rossum72e31641996-05-28 23:15:20 +00003from Tkinter import Canvas
Guido van Rossum0b0804b1994-06-28 13:48:26 +00004
5StringType = type('')
6DictionaryType = type({})
Guido van Rossum18468821994-06-20 07:49:28 +00007
Guido van Rossum72e31641996-05-28 23:15:20 +00008def _flatten(tuple):
9 res = ()
10 for item in tuple:
11 if type(item) in (TupleType, ListType):
12 res = res + _flatten(item)
13 elif item is not None:
14 res = res + (item,)
15 return res
16
Guido van Rossum18468821994-06-20 07:49:28 +000017class CanvasItem:
Guido van Rossumefa31431996-01-26 17:45:07 +000018 def __init__(self, canvas, itemType, *args, **kw):
Guido van Rossum18468821994-06-20 07:49:28 +000019 self.canvas = canvas
Guido van Rossumefa31431996-01-26 17:45:07 +000020 self.id = canvas._create(itemType, args, kw)
Guido van Rossum0b0804b1994-06-28 13:48:26 +000021 if not hasattr(canvas, 'items'):
22 canvas.items = {}
23 canvas.items[self.id] = self
Guido van Rossum18468821994-06-20 07:49:28 +000024 def __str__(self):
25 return str(self.id)
26 def __repr__(self):
27 return '<%s, id=%d>' % (self.__class__.__name__, self.id)
Guido van Rossum0b0804b1994-06-28 13:48:26 +000028 def delete(self):
29 del self.canvas.items[self.id]
Guido van Rossum18468821994-06-20 07:49:28 +000030 self.canvas.delete(self.id)
Guido van Rossum18468821994-06-20 07:49:28 +000031 def __getitem__(self, key):
Guido van Rossumfea128e1994-06-20 13:42:28 +000032 v = self.canvas.tk.split(self.canvas.tk.call(
33 self.canvas._w, 'itemconfigure',
Guido van Rossum0b0804b1994-06-28 13:48:26 +000034 self.id, '-' + key))
Guido van Rossum18468821994-06-20 07:49:28 +000035 return v[4]
36 def __setitem__(self, key, value):
Guido van Rossum72e31641996-05-28 23:15:20 +000037 self.canvas.itemconfig(self.id, {key: value})
Guido van Rossum18468821994-06-20 07:49:28 +000038 def keys(self):
39 if not hasattr(self, '_keys'):
40 self._keys = map(lambda x, tk=self.canvas.tk:
Guido van Rossumfea128e1994-06-20 13:42:28 +000041 tk.splitlist(x)[0][1:],
Guido van Rossum0b0804b1994-06-28 13:48:26 +000042 self.canvas.tk.splitlist(
43 self.canvas._do(
Guido van Rossumfea128e1994-06-20 13:42:28 +000044 'itemconfigure',
Guido van Rossum0b0804b1994-06-28 13:48:26 +000045 (self.id,))))
Guido van Rossum72e31641996-05-28 23:15:20 +000046 return self._keys
Guido van Rossum18468821994-06-20 07:49:28 +000047 def has_key(self, key):
48 return key in self.keys()
49 def addtag(self, tag, option='withtag'):
50 self.canvas.addtag(tag, option, self.id)
51 def bbox(self):
52 x1, y1, x2, y2 = self.canvas.bbox(self.id)
53 return (x1, y1), (x2, y2)
54 def bind(self, sequence=None, command=None):
Guido van Rossum421bb0e1996-07-21 02:19:32 +000055 return self.canvas.tag_bind(self.id, sequence, command)
Guido van Rossum0b0804b1994-06-28 13:48:26 +000056 def config(self, cnf=None):
57 return self.canvas.itemconfig(self.id, cnf)
Guido van Rossum18468821994-06-20 07:49:28 +000058 def coords(self, pts = ()):
59 flat = ()
60 for x, y in pts: flat = flat + (x, y)
61 return apply(self.canvas.coords, (self.id,) + flat)
62 def dchars(self, first, last=None):
63 self.canvas.dchars(self.id, first, last)
64 def dtag(self, ttd):
65 self.canvas.dtag(self.id, ttd)
66 def focus(self):
67 self.canvas.focus(self.id)
68 def gettags(self):
69 return self.canvas.gettags(self.id)
70 def icursor(self):
71 self.canvas.icursor(self.id)
72 def index(self):
73 return self.canvas.index(self.id)
74 def insert(self, beforethis, string):
75 self.canvas.insert(self.id, beforethis, string)
76 def lower(self, belowthis=None):
77 self.canvas.lower(self.id, belowthis)
78 def move(self, xamount, yamount):
79 self.canvas.move(self.id, xamount, yamount)
Guido van Rossum72e31641996-05-28 23:15:20 +000080 def tkraise(self, abovethis=None):
81 self.canvas.tkraise(self.id, abovethis)
82 raise_ = tkraise # BW compat
Guido van Rossum18468821994-06-20 07:49:28 +000083 def scale(self, xorigin, yorigin, xscale, yscale):
84 self.canvas.scale(self.id, xorigin, yorigin, xscale, yscale)
85 def type(self):
86 return self.canvas.type(self.id)
87
88class Arc(CanvasItem):
Guido van Rossum0b0804b1994-06-28 13:48:26 +000089 def __init__(self, canvas, *args):
90 CanvasItem.__init__(self, canvas, 'arc', args)
Guido van Rossum18468821994-06-20 07:49:28 +000091
92class Bitmap(CanvasItem):
Guido van Rossum0b0804b1994-06-28 13:48:26 +000093 def __init__(self, canvas, *args):
94 CanvasItem.__init__(self, canvas, 'bitmap', args)
Guido van Rossum18468821994-06-20 07:49:28 +000095
Guido van Rossum72e31641996-05-28 23:15:20 +000096class ImageItem(CanvasItem):
97 def __init__(self, canvas, *args):
98 CanvasItem.__init__(self, canvas, 'image', args)
99
Guido van Rossum18468821994-06-20 07:49:28 +0000100class Line(CanvasItem):
Guido van Rossum0b0804b1994-06-28 13:48:26 +0000101 def __init__(self, canvas, *args):
102 CanvasItem.__init__(self, canvas, 'line', args)
Guido van Rossum18468821994-06-20 07:49:28 +0000103
104class Oval(CanvasItem):
Guido van Rossum0b0804b1994-06-28 13:48:26 +0000105 def __init__(self, canvas, *args):
106 CanvasItem.__init__(self, canvas, 'oval', args)
Guido van Rossum18468821994-06-20 07:49:28 +0000107
108class Polygon(CanvasItem):
Guido van Rossum0b0804b1994-06-28 13:48:26 +0000109 def __init__(self, canvas, *args):
110 CanvasItem.__init__(self, canvas, 'polygon', args)
Guido van Rossum18468821994-06-20 07:49:28 +0000111
112class Rectangle(CanvasItem):
Guido van Rossum0b0804b1994-06-28 13:48:26 +0000113 def __init__(self, canvas, *args):
114 CanvasItem.__init__(self, canvas, 'rectangle', args)
Guido van Rossum18468821994-06-20 07:49:28 +0000115
Guido van Rossum0b0804b1994-06-28 13:48:26 +0000116# XXX "Text" is taken by the Text widget...
117class CanvasText(CanvasItem):
118 def __init__(self, canvas, *args):
119 CanvasItem.__init__(self, canvas, 'text', args)
Guido van Rossum18468821994-06-20 07:49:28 +0000120
121class Window(CanvasItem):
Guido van Rossum0b0804b1994-06-28 13:48:26 +0000122 def __init__(self, canvas, *args):
123 CanvasItem.__init__(self, canvas, 'window', args)
124
125class Group:
126 def __init__(self, canvas, tag=None):
127 if not tag:
128 tag = 'Group%d' % id(self)
129 self.tag = self.id = tag
130 self.canvas = canvas
131 self.canvas.dtag(self.tag)
132 def str(self):
133 return self.tag
134 def _do(self, cmd, *args):
135 return self.canvas._do(cmd, (self.tag,) + _flatten(args))
136 def addtag_above(self, tagOrId):
137 self._do('addtag', 'above', tagOrId)
138 def addtag_all(self):
139 self._do('addtag', 'all')
140 def addtag_below(self, tagOrId):
141 self._do('addtag', 'below', tagOrId)
142 def addtag_closest(self, x, y, halo=None, start=None):
143 self._do('addtag', 'closest', x, y, halo, start)
144 def addtag_enclosed(self, x1, y1, x2, y2):
145 self._do('addtag', 'enclosed', x1, y1, x2, y2)
146 def addtag_overlapping(self, x1, y1, x2, y2):
147 self._do('addtag', 'overlapping', x1, y1, x2, y2)
148 def addtag_withtag(self, tagOrId):
149 self._do('addtag', 'withtag', tagOrId)
150 def bbox(self):
151 return self._getints(self._do('bbox'))
152 def bind(self, sequence=None, command=None): # XXX args?
153 return self._do('bind', sequence, command)
154 def coords(self, *pts):
155 return self._do('coords', pts)
156 def dchars(self, first, last=None):
157 self._do('dchars', first, last)
158 def delete(self):
159 self._do('delete')
160 def dtag(self, tagToDelete=None):
161 self._do('dtag', tagToDelete)
162 def focus(self):
163 self._do('focus')
164 def gettags(self):
165 return self.canvas.tk.splitlist(self._do('gettags', self.tag))
166 def icursor(self, index):
167 return self._do('icursor')
168 def index(self, index):
169 return self.canvas.tk.getint(self._do('index', index))
170 def insert(self, beforeThis, string):
171 self._do('insert', beforeThis, string)
172 def config(self, cnf=None):
173 return self.canvas.itemconfigure(self.tag, cnf)
174 def lower(self, belowThis=None):
175 self._do('lower', belowThis)
176 def move(self, xAmount, yAmount):
177 self._do('move', xAmount, yAmount)
178 def tkraise(self, aboveThis=None):
179 self._do('raise', aboveThis)
180 lift = tkraise
181 def scale(self, xOrigin, yOrigin, xScale, yScale):
182 self._do('scale', xOrigin, yOrigin, xScale, yScale)
183 def select_adjust(self, index):
184 self.canvas._do('select', ('adjust', self.tag, index))
185 def select_from(self, index):
186 self.canvas._do('select', ('from', self.tag, index))
187 def select_to(self, index):
188 self.canvas._do('select', ('to', self.tag, index))
189 def type(self):
190 return self._do('type')