如何使用while真实循环添加def函数

时间:2019-04-07 19:16:48

标签: python turtle-graphics

我添加了一个函数定义,告诉您当按空格键时乌龟会跳。我的代码中还有一个while True循环,每当按下空格键时,while True循环就会暂时冻结,直到跳转完成然后继续。

我尝试在while True循环中和外部添加函数定义。我只能将函数定义放在while True循环之前,因为如果将其放在while True之后,代码将永远无法到达它。

#making the player jump
def jump():
    player.fd(100)
    player.rt(180)
    player.fd(100)
    player.lt(180)

turtle.listen()
turtle.onkey(jump, "space")

我期望while True循环不会冻结,但是无论我尝试将def放在哪里,它似乎都不起作用。

我也看到了与此类似的另一个答案,但不明白如何将其应用于代码。

任何其他建议都很好。

3 个答案:

答案 0 :(得分:2)

直到您可以使异步工作正常工作,这是一个使用乌龟自己的计时器事件的极简实现,即使在跳跃时也可以保持障碍前进:

from turtle import Screen, Turtle

def jump():
    screen.onkey(None, 'space')  # disable handler inside handler

    if jumper.ycor() == 0:  # if jumper isn't in the air
        jumper.forward(150)
        jumper.backward(150)

    screen.onkey(jump, 'space')

def move():
    hurdle.forward(6)
    if hurdle.xcor() > -400:
        screen.ontimer(move, 100)

jumper = Turtle('turtle')
jumper.speed('slowest')
jumper.penup()
jumper.setheading(90)

hurdle = Turtle('turtle')
hurdle.speed('fastest')
hurdle.penup()
hurdle.setheading(180)
hurdle.setx(400)

screen = Screen()
screen.onkey(jump, 'space')
screen.listen()

move()

screen.mainloop()

通过搜索“ [turtle-graphics] jump”,您可以在SO上找到几个更充实的版本

避免在乌龟基于事件的环境中使用while True:循环。

答案 1 :(得分:1)

我期望使用async可能很难,但是我建立了一个可行的示例。

jump内部,我使用asyncio.sleep,因此当一只乌龟正在睡觉时,另一只乌龟可以行走。没有asyncio.sleep的情况下,第一只乌龟一直行走。

import asyncio
import turtle

t1 = turtle.Turtle()
t2 = turtle.Turtle()

async def jump1():
    while True:
        t1.fd(100)
        await asyncio.sleep(0.01)
        t1.left(90)


async def jump2():
    while True:
        t2.fd(100)
        await asyncio.sleep(0.01)
        t2.right(90)

tasks = [jump1(), jump2()]

# Python 3.6.7
loop = asyncio.get_event_loop()    
loop.run_until_complete(asyncio.wait(tasks))

# Python 3.7
#asyncio.run(asyncio.wait(tasks))

但是构建更复杂的东西可能会更加困难。

我还发现了aioturtle-使用async的乌龟。也许使用aioturtle会更容易。

答案 2 :(得分:0)

问题如下:
跳转事件的代码被同步调用。这意味着,所有内容都必须等待jump()完成才能继续。这可以通过异步声明/调用jump()方法来解决。该网站在解释异步python的含义以及如何实现方面做得很好:https://hackernoon.com/asynchronous-python-45df84b82434

简而言之,这是它的实现方式(在python 3.3或更高版本中):

async def jump():
    #your code here

这只会使jump()函数异步运行。
现在,无论何时调用它,都必须像这样调用它:

await jump()

这可能不起作用,具体取决于您的确切设置。

我希望这会有所帮助。 请问我是否还有其他问题。

编辑:示例