Есть ли у черепахи функция нажатия клавиши, которая повторяет функцию только один раз?

Это немного странный вопрос, но у меня есть игра с черепахами, в которой я хочу, чтобы каждый раз, когда пользователь нажимает клавишу со стрелкой вверх, черепаха двигалась, но не продолжала двигаться, если вы удерживаете ее. Есть ли способ сделать это с черепахой? Например: onkeyrelease или onkeypress, чтобы желаемая функция выполнялась только один раз, а не снова, пока вы снова не нажмете клавишу?


person Oran    schedule 05.04.2020    source источник
comment
можешь опубликовать свой код?   -  person kederrac    schedule 05.04.2020
comment
Обычно вы делаете что-то вроде переменной, для которой вы устанавливаете значение True, когда пользователь нажимает вверх, а затем не позволяете обратному вызову что-либо делать, если эта переменная уже равна True. Затем сделайте так, чтобы обратный вызов при выпуске сбросил переменную обратно в False.   -  person Carcigenicate    schedule 05.04.2020
comment
@Carcigenicate, почему бы ему не использовать только onkeyrelease и никогда не беспокоиться о том, чтобы продолжать нажимать!   -  person SaymoinSam    schedule 05.04.2020


Ответы (2)


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

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

Вот простой пример

import turtle

m = turtle.Turtle()

def step():
  m.forward(50)

window = turtle.Screen()
window.onkeyrelease(step, "Right")
window.listen()
window.mainloop()

А вот это я сделал для прикола, надо попробовать :)

import turtle

t = turtle.Turtle()
step = 25
t.speed(0)

# set the angles according to the mode
t_angles = [180, 0, 90, 270] if turtle.mode() == "standard" else [270, 90, 0, 180]
# standard mode | logo mode
# 0   -> east   | 0   -> north
# 90  -> north  | 90  -> east
# 180 -> west   | 180 -> south
# 270 -> south  | 270 -> west

def t_left():
  t.seth(t_angles[0])
  t.forward(step)

def t_right():
  t.seth(t_angles[1])
  t.forward(step)

def t_up():
  t.seth(t_angles[2])
  t.forward(step)

def t_down():
  t.seth(t_angles[3])
  t.forward(step)

def t_hide(a, b): t.penup()
def t_show(a, b): t.pendown()
def t_white(): t.color("white")
def t_red(): t.color("red")
def t_green(): t.color("green")
def t_blue(): t.color("blue")
def t_yellow(): t.color("yellow")
def t_default(): t.color("black")

window = turtle.Screen()
# press arrows to move around
window.onkeyrelease(t_right, "Right")
window.onkeyrelease(t_left, "Left")
window.onkeyrelease(t_up, "Up")
window.onkeyrelease(t_down, "Down")
# press these for changing color
window.onkeyrelease(t_white, "w")
window.onkeyrelease(t_red, "r")
window.onkeyrelease(t_green, "g")
window.onkeyrelease(t_blue, "b")
window.onkeyrelease(t_yellow, "y")
window.onkeyrelease(t_default, "d")
# press Esc to quit
window.onkeyrelease(window.bye, "Escape")
# press left button of the mouse to put the pen
window.onclick(t_show, 1)
# press right button of the mouse to hold the pen
window.onclick(t_hide, 3)
# listen to all the events
window.listen()
# keep the window open
window.mainloop()
person SaymoinSam    schedule 05.04.2020

Я попробовал обширные onkeyrelease() примеры @SaymoinSam, но они мне не подошли. Я считаю, что проблема заключается в том, что операционная система реализует повторение клавиш, и вы не можете победить это напрямую из черепахи Python.

Альтернативный подход — просто отключить обработчик событий внутри обработчика событий:

from turtle import Screen, Turtle

turtle = Turtle()

def step():
    screen.onkey(None, 'Right')
    turtle.forward(50)

screen = Screen()
screen.onkey(step, 'Right')
screen.listen()
screen.mainloop()

Это сработает один раз и только один раз. Если вы хотите перезарядить его, просто повторите screen.onkey(step, 'Right'), чтобы настроить еще один один выстрел.

person cdlane    schedule 10.04.2020