Pygame ожидает, что пользователь нажмет клавишу

Я ищу метод, при котором программа останавливается и ожидает нажатия определенной клавиши пользователем. Могу ли я реализовать это с помощью цикла while? Мне нужен лучший алгоритм, если есть встроенная функция ожидания, чтобы избежать цикла. Я нашел несколько информации на официальном веб-сайте pygame, но ничего не помогло.

Вот алгоритмы тестирования, но они не работают:

key = "f"
while key != "K_f":
     key = pygame.key.get_pressed()
     if key[Keys.K_f]:
         do something...

person Dr. Programmer    schedule 23.12.2013    source источник


Ответы (2)


Вы можете сделать это с помощью цикла while и очереди событий:

from pygame.locals import *
def wait():
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN and event.key == K_f:
                return
person Bartlomiej Lewandowski    schedule 23.12.2013
comment
Ваше здоровье. Выглядит неплохо, но я получаю сообщение об ошибке для состояния if с K_f. Я меняю его на: if event.type == pygame.KEYDOWN and event.key == K_f: Но я получаю следующую ошибку: NameError: name 'K_f' is not defined поэтому я пытаюсь изменить его на ... = pygame.K_f, но теперь это похоже на то, что статус if не выполняется, когда я нажимаю клавишу f. - person Dr. Programmer; 23.12.2013
comment
Только что проверил, у меня работает, насчет NameErrors, забыл включить from pygame import * вверху, можно оставить с префиксом pygame.. Попробуйте распечатать event.key в событии KEYDOWN, чтобы увидеть, что вы нажимаете в данный момент. Может дело в клавиатуре. - person Bartlomiej Lewandowski; 23.12.2013
comment
AFAIK, атрибуты в каждом типе события разные. Таким образом, событие не всегда должно иметь атрибут key. Например, вызов event.key будет ошибкой для события MOUSEMOTION. - person Hzzkygcs; 24.04.2020

Если вы ждете нажатия клавиши, вы можете использовать функцию event.wait (). Это полезно, потому что не требует большой обработки.

import pygame
from pygame.locals import *

pygame.event.clear()
while True:
    event = pygame.event.wait()
    if event.type == QUIT:
        pygame.quit()
        sys.exit()
    elif event.type == KEYDOWN:
        if event.key = K_f:
            do something...

Обратите внимание, что event.wait () ожидает появления событий в кэше событий, кеш событий должен быть очищен в первую очередь.

документация по pygame.event

person cweb    schedule 08.03.2015
comment
Это хорошо, за исключением случаев, когда требуются очень точные отметки времени события. - person Jacob Lee; 09.03.2017