2013-08-11 4 views
1

У меня есть эта простая программа, сделанная с Python 2.7.5. В основном я просто рисую кучу случайных вещей на экран, но когда я закрываю холст, я получаю странную ошибку.Python turtle выдает ошибку при закрытии

import turtle 
import random 
import time 

turtle.hideturtle() 

class Mus: 

    def __init__(self): 
     turtle.setx(random.randint(1,100)) 
     turtle.sety(random.randint(1,100)) 
     turtle.circle(random.randint(1,100)) 

while True: 
    Mus() 

turtle.exitonclick() 

Когда я закрываю программу, я получаю эту ошибку:

Traceback (most recent call last): 
    File "/Users/jurehotujec/Desktop/running.py", line 15, in <module> 
    Mus() 
    File "/Users/jurehotujec/Desktop/running.py", line 12, in __init__ 
    turtle.circle(random.randint(1,100)) 
    File "<string>", line 1, in circle 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/turtle.py", line 1908, in circle 
    self._rotate(w) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/turtle.py", line 3110, in _rotate 
    self._update() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/turtle.py", line 2564, in _update 
    self._update_data() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/turtle.py", line 2555, in _update_data 
    self._pencolor, self._pensize) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/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.7/lib/python2.7/lib-tk/Tkinter.py", line 2240, in coords 
    self.tk.call((self._w, 'coords') + args))) 
TclError: invalid command name ".4335016920" 

Что я делаю неправильно? Я новичок в Python, так что любая помощь будет оценила :)

Благодарности

+0

Я не думаю, что вы должны беспокоиться об этом - в конечном счете, это будет от какого-то вопроса глубоко внутри стандартной библиотеки вокруг ненадо промывочного события в процессе выхода. Но кроме трассировки, он делает то, что вы хотите, не так ли? – AdamKG

+0

да, но это выглядит просто уродливым :) – intelis

+1

Ну, вы можете «импортировать Tkinter», а затем обернуть ваши вызовы 'Mus()' в try/except block catch 'Tkinter.TclError' с 'break' в исключении тела , но это была бы плохая идея, так как она также проглотила бы «реальные» ошибки в вашем коде приложения. Но AFAICT здесь есть законная ошибка, поэтому * должен быть * traceback - просто не один, о котором вы должны что-либо делать, ошибка не связана с вашим кодом. – AdamKG

ответ

1

Кажется, что ваш цикл пытается продолжить после Tk уничтожили некоторые важные объекты. Вы могли бы сигнализировать о закрытии события с помощью флага:

import turtle 
import random 
import time 
import Tkinter as tk 



turtle.hideturtle() 

closed = False 
def on_close(): 
    global closed 
    closed = True 
    exit() 

# Register hander for close event  
tk._default_root.protocol("WM_DELETE_WINDOW", on_close) 


class Mus: 

    def __init__(self): 
     turtle.setx(random.randint(1,100)) 
     turtle.sety(random.randint(1,100)) 
     turtle.circle(random.randint(1,100)) 

# check the flag 
while not closed: 
    Mus() 





turtle.exitonclick()