Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python海龟等待按键_Python_Turtle Graphics_Fractals - Fatal编程技术网

Python海龟等待按键

Python海龟等待按键,python,turtle-graphics,fractals,Python,Turtle Graphics,Fractals,我想通过让用户在每次移动前按一个键,一步一步地跟随海龟的绘画 我可以通过以下方式请求用户输入: def wait(): input('Press a key') 但这是一个可怕的解决方案,因为焦点离开了海龟窗口 我知道screen.listen(),可以使用screen.onkeypress()-例如my_screen.onkeypress('wait'),但不确定如何实现这一点 编辑:我意识到我应该更具体一些。我试图追踪科赫曲线的递归。到目前为止,我的代码如下: import tur

我想通过让用户在每次移动前按一个键,一步一步地跟随海龟的绘画

我可以通过以下方式请求用户输入:

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()

这听起来像是递归生成器的工作!我们开始运行分形代码,但我们使用
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分形的附加部分。我们还可以通过一个键事件来实现这一点,使导入和
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()

请注意,这是对turtle图形窗口中的向上箭头键的响应,而不是对控制台中的键的响应。

如下更改您的功能:

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

注: 您必须导入
sys
termios
tty