Tkinter: Exception RuntimeError: 'maximum recursion depth exceeded'

Olaf Dietrich odt at dtrx.de
Tue Oct 12 10:43:10 EDT 2010


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

Olaf



More information about the Python-list mailing list