Государственная очистка в Python Turtle - PullRequest
0 голосов
/ 28 ноября 2018

Я пишу программу, которая запрашивает у пользователя целое число> 0, которое используется как фактор сложности для рисования кривой Коха.Программа выполняется нормально, один раз.При повторном запуске Terminator вызывается, и трассировка указывает на то, что я считаю переменной aTurtle, которая не очищает свое последнее состояние.Если я перезагружаю ядро ​​и очищаю все выводы, он снова работает нормально один раз, затем проблема повторяется.Что я пропускаю?

Это было сконструировано и выполнено в Jupyter, а также протестировано в qtconsole.Код указан ниже:

import turtle
aTurtle = turtle.Turtle()

#Functions
def drawLS(aTurtle, instructions):
    for cmd in instructions:
        if cmd == 'F':
            aTurtle.forward(5)        
        elif cmd == '+':
            aTurtle.right(70)
        elif cmd == '-':
            aTurtle.left(70)
        else :
            print('Error : %s is an unknown command '%cmd)

def applyProduction():
    axiom = 'F'
    myRules = {'F': 'F-F++F-F'}
    for i in range(n):
        newString = ""
        for ch in axiom :
            newString = newString + myRules.get(ch, ch)
        axiom = newString
    return axiom

def lsystem():
    win = turtle.Screen()
    aTurtle.up()
    aTurtle.setposition(-200, 0)
    aTurtle.down()
    aTurtle.setheading(0)
    newRules = applyProduction()
    drawLS (aTurtle, newRules)
    win.exitonclick()

#Main
while True:
    try:
        n = int(input("Enter an integer greater than 0: "))
        break
    except:
        print ("Error, input was not an integer, please try again.")
if n < 1:
       print ("Error, input was not an integer greater than 0.")
else:
    lsystem()

1 Ответ

0 голосов
/ 29 ноября 2018

Как правило, вы не должны планировать выживать при win.exitonclick() или любой другой команде черепахи, которые передают управление в цикл событий tkinter.Для этого есть свои приемы, но не стоит беспокоиться, когда проще просто избежать этой ситуации.То, что вы хотите, это win.clear() или, возможно, win.reset().Я включил это ниже и переписал вашу логику подсказок, чтобы использовать ее собственное событие щелчка вместо exitonclick() и использовать графику numinput():

from turtle import Screen, Turtle

def drawLS(turtle, instructions):
    for cmd in instructions:
        if cmd == 'F':
            turtle.forward(5)
        elif cmd == '+':
            turtle.right(70)
        elif cmd == '-':
            turtle.left(70)
        else:
            print('Error : %s is an unknown command '%cmd)

def applyProduction(n):
    axiom = 'F'
    myRules = {'F': 'F-F++F-F'}

    for _ in range(n):
        newString = ""
        for ch in axiom:
            newString += myRules.get(ch, ch)
        axiom = newString

    return axiom

def lsystem(n):
    aTurtle.up()
    aTurtle.setposition(-200, 0)
    aTurtle.down()
    aTurtle.setheading(0)
    newRules = applyProduction(n)
    drawLS(aTurtle, newRules)

def prompt(x=None, y=None):  # dummy arguments for onclick(), ignore them
    screen.onclick(None)

    n = screen.numinput("Complexity Factor", "Enter an integer greater than 0", minval=1, maxval=100)

    if n is not None:
        screen.clear()
        lsystem(int(n))

    screen.onclick(prompt)

screen = Screen()

aTurtle = Turtle()
aTurtle.speed('fastest')  # because I have no patience

prompt()

screen.mainloop()

Когда рисунок закончится, нажмите наэкран, чтобы получить новое приглашение для другого фактора сложности и новый чертеж.

...