@@ -126,40 +126,41 @@ def renderIntoRectangle(widgetType, values, offset, args):
126
126
outlineWidth = getValue (args , values ['outlineWidth' ]) if 'outlineWidth' in values else 1
127
127
else :
128
128
outlineWidth = 0
129
- if widgetType == 'rect ' :
129
+ if widgetType == 'rectangle ' :
130
130
widgetId = getCanvas ().create_rectangle (left , top , right , bottom , fill = fill , outline = outline , width = outlineWidth )
131
131
elif widgetType == 'ellipse' :
132
132
widgetId = getCanvas ().create_oval (left , top , right , bottom , fill = fill , outline = outline , width = outlineWidth )
133
133
else :
134
134
return f'Unknown widget type \' { widgetType } \' '
135
- if 'id' in values :
136
- id = getValue (args , values ['id' ])
137
- widgetSpec = {
138
- "id" : widgetId ,
139
- "left" : left ,
140
- "top" : top ,
141
- "width" : width ,
142
- "height" : height
143
- }
144
- elements [id ] = widgetSpec
145
- zlist .append ({id : widgetSpec })
135
+ if 'name' in values :
136
+ widgetName = getValue (args , values ['name' ])
137
+ else :
138
+ widgetName = None
139
+ widgetSpec = {
140
+ "type" : widgetType ,
141
+ "name" : widgetName ,
142
+ "id" : widgetId ,
143
+ "left" : left ,
144
+ "top" : top ,
145
+ "width" : width ,
146
+ "height" : height ,
147
+ "children" : []
148
+ }
149
+ elements [widgetName ] = widgetSpec
150
+ zlist .append ({widgetName : widgetSpec })
146
151
if '#' in values :
147
152
children = values ['#' ]
148
153
if type (children ) == list :
149
154
for item in children :
150
155
if item in values :
151
156
child = values [item ]
152
- result = renderWidget (child , {'dx' : left , 'dy' : top }, args )
153
- if result != None :
154
- return result
155
- else :
156
- return f'Unable to render \' { item } \' '
157
+ childSpec = renderWidget (child , {'dx' : left , 'dy' : top }, args )
158
+ widgetSpec ['children' ].append (childSpec ['name' ])
157
159
else :
158
160
child = values [children ]
159
- result = renderWidget (child , offset )
160
- if result != None :
161
- return result
162
- return None
161
+ childSpec = renderWidget (child , {'dx' : left , 'dy' : top }, args )
162
+ widgetSpec ['children' ].append (childSpec ['name' ])
163
+ return widgetSpec
163
164
164
165
def renderText (values , offset , args ):
165
166
left = getValue (args , values ['left' ]) if 'left' in values else 10
@@ -201,20 +202,24 @@ def renderText(values, offset, args):
201
202
else :
202
203
containerId = getCanvas ().create_rectangle (left , top , right , bottom , fill = fill , outline = outline , width = outlineWidth )
203
204
textId = canvas .create_text (left + xoff , fontTop + adjust , fill = color , font = f'"{ fontFace } " { fontSize } { fontWeight } ' , text = text , anchor = anchor )
204
- if 'id' in values :
205
- id = getValue (args , values ['id' ])
206
- widgetSpec = {
207
- "id" : textId ,
208
- "containerId" : containerId ,
209
- "left" : left ,
210
- "top" : top ,
211
- "width" : width ,
212
- "height" : height
213
- }
214
- elements [id ] = widgetSpec
215
- zlist .append ({id : widgetSpec })
216
- return None
217
-
205
+ if 'name' in values :
206
+ widgetName = getValue (args , values ['name' ])
207
+ else :
208
+ widgetName = None
209
+ widgetSpec = {
210
+ "type" : "text" ,
211
+ "name" : widgetName ,
212
+ "id" : textId ,
213
+ "containerId" : containerId ,
214
+ "left" : left ,
215
+ "top" : top ,
216
+ "width" : width ,
217
+ "height" : height
218
+ }
219
+ elements [widgetName ] = widgetSpec
220
+ zlist .append ({widgetName : widgetSpec })
221
+ return widgetSpec
222
+
218
223
def renderImage (values , offset , args ):
219
224
global images
220
225
left = getValue (args , values ['left' ]) if 'left' in values else 10
@@ -227,30 +232,34 @@ def renderImage(values, offset, args):
227
232
bottom = top + height
228
233
src = getValue (args , values ['src' ]) if 'src' in values else None
229
234
containerId = getCanvas ().create_rectangle (left , top , right , bottom , width = 0 )
230
- if 'id' in values :
231
- id = values ['id' ]
232
- widgetSpec = {
233
- "id" : containerId ,
234
- "left" : left ,
235
- "top" : top ,
236
- "width" : width ,
237
- "height" : height
238
- }
239
- elements [id ] = widgetSpec
240
- zlist .append ({id : widgetSpec })
241
- if src == None :
242
- return f'No image source given for \' { id } \' '
235
+ if 'name' in values :
236
+ widgetName = values ['name' ]
237
+ else :
238
+ widgetName = None
239
+ widgetSpec = {
240
+ "type" : "image" ,
241
+ "nme" : widgetName ,
242
+ "id" : containerId ,
243
+ "left" : left ,
244
+ "top" : top ,
245
+ "width" : width ,
246
+ "height" : height
247
+ }
248
+ elements [widgetName ] = widgetSpec
249
+ zlist .append ({widgetName : widgetSpec })
250
+ if src == None :
251
+ raise (Exception (f'No image source given for \' { id } \' ' ))
243
252
img = (Image .open (src ))
244
253
resized_image = img .resize ((width , height ), Image .ANTIALIAS )
245
254
new_image = ImageTk .PhotoImage (resized_image )
246
255
imageid = getCanvas ().create_image (left , top , anchor = 'nw' , image = new_image )
247
256
images [containerId ] = {'id' : imageid , "image" : new_image }
248
- return None
257
+ return widgetSpec
249
258
250
259
# Create a canvas or render a widget
251
260
def renderWidget (widget , offset , args ):
252
261
widgetType = widget ['type' ]
253
- if widgetType in ['rect ' , 'ellipse' ]:
262
+ if widgetType in ['rectangle ' , 'ellipse' ]:
254
263
return renderIntoRectangle (widgetType , widget , offset , args )
255
264
elif widgetType == 'text' :
256
265
return renderText (widget , offset , args )
@@ -263,12 +272,10 @@ def renderSpec(spec, offset, args):
263
272
# If a list, iterate it
264
273
if type (widgets ) is list :
265
274
for widget in widgets :
266
- result = renderWidget (spec [widget ], offset , args )
267
- if result != None :
268
- return result
275
+ renderWidget (spec [widget ], offset , args )
269
276
# Otherwise, process the single widget
270
277
else :
271
- return renderWidget (spec [widgets ], offset , args )
278
+ renderWidget (spec [widgets ], offset , args )
272
279
273
280
# Main entry point
274
281
offset = {'dx' : 0 , 'dy' : 0 }
@@ -277,13 +284,13 @@ def renderSpec(spec, offset, args):
277
284
278
285
# If it'a string, process it
279
286
if type (spec ) is str :
280
- return renderSpec (json .loads (spec ), offset , {})
287
+ renderSpec (json .loads (spec ), offset , {})
281
288
282
289
# If it's a 'dict', extract the spec and the args
283
290
if type (spec ) is dict :
284
291
args = spec ['args' ]
285
292
spec = json .loads (spec ['spec' ])
286
- return renderSpec (spec , offset , args )
293
+ renderSpec (spec , offset , args )
287
294
288
295
# Get the widget whose name is given
289
296
def getElement (name ):
@@ -302,3 +309,22 @@ def setBackground(name, value):
302
309
id = getElement (name )['id' ]
303
310
getCanvas ().itemconfig (getElement (name )['id' ], fill = value )
304
311
312
+ # Move an element by an amount
313
+ def moveElement (name , dx , dy ):
314
+ element = getElement (name )
315
+ getCanvas ().move (element ['id' ], dx , dy )
316
+ element ['left' ] += dx
317
+ element ['top' ] += dy
318
+ for childName in element ['children' ]:
319
+ element = getElement (childName )
320
+ getCanvas ().move (element ['id' ], dx , dy )
321
+
322
+ # Move an element to a new location
323
+ def moveElementTo (name , left , top ):
324
+ element = getElement (name )
325
+ moveElement (name , left - element ['left' ], top - element ['top' ])
326
+
327
+ # Get an attribute of an element
328
+ def getAttribute (name , attribute ):
329
+ element = getElement (name )
330
+ return element [attribute ]
0 commit comments