как добавить функцию def с циклом while true - PullRequest
3 голосов
/ 07 апреля 2019

Я добавил определение функции, чтобы моя черепаха прыгала при нажатии клавиши пробела. В моем коде также есть цикл 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 ]

2 голосов
/ 08 апреля 2019

Пока вы не включите эту асинхронную работу, вот минималистская реализация, использующая собственное событие таймера черепахи, чтобы препятствие двигалось вперед, даже при прыжках:

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

Вы можете найти несколько более совершенных версийоб этом в SO путем поиска '[turtle-graphics] jump'

Избегайте использования петли while True: в среде, основанной на событиях turtle.

1 голос
/ 08 апреля 2019

Я ожидал, что это может быть трудно сделать с 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.

0 голосов
/ 07 апреля 2019

Проблема заключается в следующем:
код события перехода вызывается синхронно. Это означает, что все должно ждать завершения jump (), прежде чем продолжить. это можно исправить, объявив / вызвав метод jump () асинхронно. Этот сайт хорошо объясняет, что означает асинхронный питон и как его реализовать: https://hackernoon.com/asynchronous-python-45df84b82434

вкратце, вот как это будет реализовано (в Python 3.3 или выше):

async def jump():
    #your code here

это просто делает функцию jump () запущенной асинхронно.
теперь, когда вы звоните, вы должны называть это так:

await jump()

это может не работать, в зависимости от ваших точных настроек.

Надеюсь, это поможет. пожалуйста, спросите меня, если у вас есть еще вопросы.

РЕДАКТИРОВАТЬ: пример

...