2017-01-13 3 views
0

Когда я запустил мою программу python из терминала, она будет работать нормально. Он использует черепаху, чтобы сделать изображение в цикле while.Как правильно закрыть Python Turtle

Если закрыть программу после того, как цикл в то время как уже finsished, а затем попытаться запустить его снова выдает ошибку, но если я запускаю его снова после того, что он работает отлично

Bur, если я закрою программу в то время как он еще в то время цикла он будет бросать ошибку, а затем, когда я пытаюсь запустить его снова будет работать нормально

Я думаю, что черепаха не закрывается должным образом, но каждый способ остановить это ничего не делает

Это ошибка:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/home/tristan/Documents/Python/Orbit/orbit.py", line 16, in orbit 
    t.goto(xPos,yPos) 
    File "<string>", line 5, in goto 
turtle.Terminator 

Мой код:

import turtle as t 
import time 
import math 

def orbit(y): 
    xPos = 0 
    yPos = y 

    while (yPos < 15) : 

     t.goto(xPos,yPos) 
     yPos += 1 

    time.sleep(0.005) 

t.exitonclick() 
+0

шоу кода. Как вы его закрываете? У вас есть «exitonclick» и подобные функции для завершения скрипта. Он должен правильно останавливать «mainloop». – furas

+0

Да, у меня это есть, но он не работает –

+0

Мы не можем помочь вам без вашего кода. Теоретически он должен остановиться, но код может быть некорректно сконструирован, и вы можете сделать что-то, чего вы не должны делать. – furas

ответ

0

exitonclick() удаляет из памяти некоторые объекты, которые обычно turtle нужно работать - так что если вы попытаетесь запустить в терминале/«Python Shell» любую команду turlte после exitonclick(), то вы получите сообщение об ошибке turtle.Terminator ,

exitonclick() ожидает, что после exitonclick() Python будет закрыт и turtle не нужен этот объект.

Может быть, если вы могли бы заставить Python импортировать снова turtle модуль тогда, возможно, он мог бы работать снова (но, как правило Python помнить импортированные модули и не импортировать еще раз, когда вы снова import turtle)


EDIT: Я проверил исходный код из turtle и, кажется, что вы можете установить

turtle.TurtleScreen._RUNNING = True 

запустить turtle снова после exitonclick()

Попробуйте этот код и без turtle.TurtleScreen._RUNNING = True

import turtle as t 

t.goto(0,50) 
t.exitonclick() 

t.TurtleScreen._RUNNING = True 

t.goto(50,150) 
t.exitonclick() 

t.TurtleScreen._RUNNING = True 

Но, возможно, более сложный код не будет работать, потому что exitonclick() делает другие вещи - ORYGINAŁ функция, выполняемая с помощью exitonclick()

def _destroy(self): 
    root = self._root 
    if root is _Screen._root: 
     Turtle._pen = None 
     Turtle._screen = None 
     _Screen._root = None 
     _Screen._canvas = None 
    TurtleScreen._RUNNING = False 
    root.destroy() 
+0

см. Новый код в ответе. – furas