On Oct 12, 9:43 am, o...@dtrx.de (Olaf Dietrich) wrote:
> I have the following (now extremely minimalistic) Tkinter
> application:
>
> --------------- START --------------------------------------------
>
> #! /usr/bin/python2.6
>
> import sys
> import Tkinter
> import numpy
> from PIL import Image, ImageTk
>
> class Viewer(object):
>
>     def __init__(self, tk_root):
>         '''Initialize viewer object for NumPy arrays.'''
>         self.root = tk_root
>         self.data = numpy.zeros((512,512))
>         self.canvas = Tkinter.Canvas(self.root, width=512, height=512)
>         self.canvas.pack()
>         self.canvas.bind('<Button1-Motion>', self.__leftbutton_motion)
>         self.viewdata()
>
>     def viewdata(self):
>         '''Update the currently viewed image data.'''
>         # convert to Tkinter photo object and insert into canvas
>         data = (self.data*255).astype('uint8')
>         img = Image.fromstring('L', (512,512), data.tostring())
>         self.photo = ImageTk.PhotoImage(img)
>         self.canvas.create_image(1, 1, image=self.photo, anchor=Tkinter.NW)
>         self.root.update()
>
>     def __leftbutton_motion(self, e):
>         '''Handle Ctrl + left mouse button (button 1) motion.'''
>         self.data[e.y, e.x] = 1
>         self.viewdata()
>
> # sys.setrecursionlimit(400)
> tk = Tkinter.Tk()
> Viewer(tk)
> tk.mainloop()
>
> --------------- END ----------------------------------------------
>
> With this class, I can "draw" with the mouse onto the
> canvas (originally, the points were connected with
> lines ...).
>
> After some somewhat heavy mouse action inside the
> canvas (with the left button pressed), the application throws:
>
> | Exception RuntimeError: 'maximum recursion depth exceeded' in <bound method 
> PhotoImage.__del__ of <Tkinter.PhotoImage instance at 0x19c0998>> ignored
> | Exception in Tkinter callback
> | Traceback (most recent call last):
> |   File "/usr/local/apps/python/lib/python2.6/lib-tk/Tkinter.py", line 1410, 
> in __call__
> |     return self.func(*args)
> |   File "./test_recursion.py", line 31, in __leftbutton_motion
> |     self.viewdata()
> |   File "./test_recursion.py", line 24, in viewdata
> |     self.photo = ImageTk.PhotoImage(img)
> |   File "/usr/local/apps/python/lib/python2.6/site-packages/PIL/ImageTk.py", 
> line 113, in __init__
> |     self.__photo = apply(Tkinter.PhotoImage, (), kw)
>
> (and similiar ones)
>
> This error can be provoked faster by setting the recursion limit
> to lower values (e.g. 400 as in the comment above).
>
> Is there anything I can do (apart from increasing the recursion
> limit) to avoid this exception? Can I improve anything in the
> script above to make the whole thing more robust?
>
> Thanks in advance for any help or suggestions

It seems very heavy-handed to create 1-pixel images for drawing onto
the canvas.  Any reason not to use something lighter weight?

I suspect the "self.root.update()" is the problem.  Try
update_idletasks() instead, or to even avoid it if possible.  You
don't want to call update in the event loop, because you are likely
reprocessing from the same call, causing the recursion.

Jeff
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to