Это звучит как работа для рекурсивного генератора!Мы запускаем фрактальный код, но используем yield
и yield from
, чтобы он останавливал каждый шаг на этом пути.Затем у нас есть событие щелчка экрана, которое делает next()
на нашем генераторе:
from turtle import Turtle, Screen
def koch(t, order, size):
"""
Make turtle t draw a Koch fractal of 'order' and 'size'.
Leave the turtle facing the same direction.
"""
if order == 0:
t.forward(size) # The base case is just a straight line
yield
else:
yield from koch(t, order - 1, size / 3) # Go 1/3 of the way
t.left(60)
yield from koch(t, order - 1, size / 3)
t.right(120)
yield from koch(t, order - 1, size / 3)
t.left(60)
yield from koch(t, order - 1, size / 3)
def click_handler(x, y):
screen.onclick(None) # disable handler while in handler
try:
next(generator)
except StopIteration:
return
screen.onclick(click_handler)
screen = Screen()
turtle = Turtle()
generator = koch(turtle, 3, 200)
screen.onclick(click_handler)
screen.mainloop()
Запустите программу.Каждый раз, когда вы щелкаете мышью по окну, вы получаете дополнительный сегмент вашего фрактала Коха.Мы также можем выполнить эту работу с ключевым событием, сохранив при этом процедуры импорта и koch()
одинаковыми:
...
def key_handler():
screen.onkey(None, "Up") # disable handler while in handler
try:
next(generator)
except StopIteration:
return
screen.onkey(key_handler, "Up")
screen = Screen()
turtle = Turtle()
generator = koch(turtle, 3, 200)
screen.onkey(key_handler, "Up")
screen.listen()
screen.mainloop()
Обратите внимание, что это реагирует на нажатия клавиш со стрелками вверх в графическом окне черепахи, а не нажатия клавиш вконсоль.