Python Turtle ждет нажатия клавиш - PullRequest
0 голосов
/ 21 мая 2018

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

Я могу сделать это, запросив ввод данных пользователем так:

def wait():
    input('Press a key')

, но это ужасное решение, поскольку фокус покидает окно черепахи.

Я знаюscreen.listen() и может установить прослушиватель событий с помощью screen.onkeypress().- Например, my_screen.onkeypress('wait'), но не уверен, как это реализовать.

РЕДАКТИРОВАТЬ: я понимаю, что я, вероятно, должен быть более конкретным.Я пытаюсь отследить рекурсию кривой Коха.Мой код до сих пор ниже:

import turtle

def koch(t, order, size):
    """
       Make turtle t draw a Koch fractal of 'order' and 'size'.
       Leave the turtle facing the same direction.
    """
    wait_for_keypress()
    if order == 0:          # The base case is just a straight line
        t.forward(size)
    else:
        koch(t, order-1, size/3)   # Go 1/3 of the way
        t.left(60)
        koch(t, order-1, size/3)
        t.right(120)
        koch(t, order-1, size/3)
        t.left(60)
        koch(t, order-1, size/3)


def wait_for_keypress():
    input('Press a key') # There must be a better way

t = turtle.Turtle()
s = turtle.Screen()
s.listen()

koch(t, 3, 100)

turtle.done()

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

измените свою функцию следующим образом:

def wait_for_keypress():
    print("'Press a key'")
    fd = sys.stdin.fileno()
    try:
        tty.setraw(fd)
        ch = sys.stdin.read(1)
    except:
        pass

На основе Вручную управляйте Python Turtle с помощью клавиатуры.

Примечание:

необходимо импортировать sys, termios и tty

0 голосов
/ 21 мая 2018

Это звучит как работа для рекурсивного генератора!Мы запускаем фрактальный код, но используем 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()

Обратите внимание, что это реагирует на нажатия клавиш со стрелками вверх в графическом окне черепахи, а не нажатия клавиш вконсоль.

...