Python Turtle удерживает функцию ключа - PullRequest
0 голосов
/ 28 февраля 2019

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

def lbump_move_up():
    x = lbump.ycor()
    x += bumpspeed
    if x > 240:
        x = 240
    lbump.sety(x)

def lbump_move_down():
    x = lbump.ycor()
    x -= bumpspeed
    if x < -240:
        x = -240
    lbump.sety(x)

def rbump_move_up():
    x = rbump.ycor()
    x += bumpspeed
    if x > 240:
        x = 240
    rbump.sety(x)

def rbump_move_down():
    x = rbump.ycor()
    x -= bumpspeed
    if x < -240:
        x = -240
    rbump.sety(x)

turtle.listen()
turtle.onkey(lbump_move_up,'w')
turtle.onkey(rbump_move_up,'Up')
turtle.onkey(lbump_move_down,'s')
turtle.onkey(rbump_move_down,'Down')
turtle.onkey(ball_move,'Return')

1 Ответ

0 голосов
/ 07 августа 2019

У меня нет полного ответа на это, так как я пришел сюда в поисках одного сам.Тем не менее, у меня есть некоторый прогресс в этом, что кто-то еще может закончить ...

Вы можете создать новый класс, который вызывает как рекурсивную функцию следующим образом:

class function2:
    def __init__(self,fun,args=None):
        self.fun=fun
        self.args=args

    def begin_loop(self):
        self.looping=True
        self.loop()

    def loop(self):
        self.fun(self.args)
        if self.looping: self.loop()

    def end_loop(self):
        self.looping=False

Теперь, чтобы связать егоВ вашем примере вы можете преобразовать свои функции в function2s и таким образом вызвать их onkeypress следующим образом:

l_up=function2(lbump_move_up)
r_up=function2(rbump_move_up)
l_down=function2(lbump_move_down)
r_down=function2(rbump_move_down)

Wn=turtle.Screen()

Wn.onkeypress(l_up.begin_loop,'w')
Wn.onkeypress(r_up.begin_loop,'Up')
Wn.onkeypress(l_down.begin_loop,'s')
Wn.onkeypress(r_down.begin_loop,'Down')

Wn.onkeyrelease(l_up.end_loop,'w')
Wn.onkeyrelease(r_up.end_loop,'Up')
Wn.onkeyrelease(l_down.end_loop,'s')
Wn.onkeyrelease(r_down.end_loop,'Down')

Wn.listen()

Итак, к вопросу: RecursionErrors

Если вы хотите, чтобы ваша функция вызывала небольшое изменение, тогда вам нужно будет удерживать кнопку в течение длительного времени, и это вызывает RecursionErrors - на которые, по крайней мере, в этом случае, похоже, не влияют операторы try / исключением.

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

...