-
-
Notifications
You must be signed in to change notification settings - Fork 31.7k
turtle: _tkinter.TclError: invalid command name ".10170160" #50888
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
I tried the following turtle program; it was taking some time to
def f(length, depth):
if depth == 0:
forward(length)
else:
f(length/3, depth-1)
right(60)
f(length/3, depth-1)
left(120)
f(length/3, depth-1)
right(60)
f(length/3, depth-1)
f(500, 4) > python play.py
Traceback (most recent call last):
File "/Users/sridharr/as/pypm/bin/python", line 41, in <module>
execfile(sys.argv[0])
File "play.py", line 15, in <module>
f(500, 4)
File "play.py", line 11, in f
f(length/3, depth-1)
File "play.py", line 7, in f
f(length/3, depth-1)
File "play.py", line 9, in f
f(length/3, depth-1)
File "play.py", line 10, in f
left(120)
File "<string>", line 1, in left
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/
lib-tk/turtle.py", line 1612, in left
self._rotate(angle)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/
lib-tk/turtle.py", line 3107, in _rotate
self._update()
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/
lib-tk/turtle.py", line 2562, in _update
self._update_data()
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/
lib-tk/turtle.py", line 2553, in _update_data
self._pencolor, self._pensize)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/
lib-tk/turtle.py", line 569, in _drawline
self.cv.coords(lineitem, *cl)
File "<string>", line 1, in coords
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/
lib-tk/Tkinter.py", line 2136, in coords
self.tk.call((self._w, 'coords') + args)))
_tkinter.TclError: invalid command name ".10170160"
> |
Anyone with turtle/Tkinter knowledge who can shed some light on this? |
I have come across the same bug. To reproduce, run Demo/turtle/tdemo_round_dance.py and kill the Tk window before the "dance" stops. The mysterious command name ".10170160" is simply the generated name for the canvas widget - '.' + repr(id(self)). See BaseWidget.__init__ in tkinter. |
Same error occurs when the python -m turtle demo is interrupted by closing the window. I think the correct fix is to exit when the window is closed, but I cannot figure out the best way to achieve that. This probably should be done at the application/test level. |
I was looking at this more, and from my understanding, the turtle code is continuing to run even when the TK window is destroyed. Thus the crash. It looks like the drawing functions are being made on the fly with the following method: for methodname in _tg_turtle_functions:
pl1, pl2 = getmethparlist(eval('Turtle.' + methodname))
if pl1 == "":
print(">>>>>>", pl1, pl2)
continue
defstr = ("def %(key)s%(pl1)s: return _getpen().%(key)s%(pl2)s" %
{'key':methodname, 'pl1':pl1, 'pl2':pl2})
exec(defstr)
eval(methodname).__doc__ = _turtle_docrevise(eval('Turtle.'+methodname).__doc__) So while all the methods are being generated, I am going to add in a check to see if the window was destroyed before running the pen code. If it was, then I exit gratefully. The check will be duplicated for each pen method, but I feel it is the best way to contain the check within the turtle.py module. The other option would be to make the user check for it, which is not a good option. |
So I have a patch that fixes the original problem, but doesn't fix the crash with the tdemo_round_dance.py. However, I was wondering why TurtleScreen._RUNNING = True in the _destroy method. Can anyone shed some light on this? Here is the current state of my patch. |
So it looks like the bug fix was really simple. I just needed to set TurtleScreen._RUNNING to True when the screen object tries to get destroyed. |
Oops, pressed submit too soon. Now the programs raise a Terminator exception rather than a TclError, which I think is correct because the programs are calling Turtle methods when the TurtleScreen had been destroyed. I wasn't sure if it was better to return None rather than raise an exception, but I think raising exception is correct, as these programs are not calling mainloop to handle event loops. So when the user closes the window, round_dance.py should handle that. |
I can make it worth such that it doesn't raise a Terminator error. This works great when working with Turtle on the command line. I basically check if the root exists for all Tk canvas calls. If it got destroyed, then it just returns. However, if you run the following recursive code, it will just keep popping up a window forever unless you Ctrl+C out of the program. So that is not going to work. I still believe raising an error is the proper approach. |
Here is more complete patch. |
Any feedback? |
New changeset 15dd9d6cc632 by Serhiy Storchaka in branch '2.7': New changeset 1628484c9408 by Serhiy Storchaka in branch '3.4': New changeset d8e494986caf by Serhiy Storchaka in branch 'default': |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: