которым Pygame.ключ.get pressed() не работает

Я читал подобные вопросы на переполнение стека, но они не помогли. Вот мой код:

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Hello World')
pygame.mouse.set_visible(1)

done = False
clock = pygame.time.Clock()

while not done:
    clock.tick(60)

    keyState = pygame.key.get_pressed()

    if keyState[pygame.K_ESCAPE]:
        print('nGame Shuting Down!')
        done = True

клавишей escape не выходит из игры и не печатает сообщение. Это жук? Если я напечатаю значение для keyState[pygame.K_ESCAPE], он всегда равен нулю.

4 ответов


проблема в том, что вы не обрабатываете очередь событий pygame. Вы должны просто позвонить pygame.event.pump() в конце вашего цикла, а затем ваш код прекрасно работает:

...
while not done:
    clock.tick(60)

    keyState = pygame.key.get_pressed()

    if keyState[pygame.K_ESCAPE]:
        print('\nGame Shuting Down!')
        done = True
    pygame.event.pump() # process event queue

С docs (выделено мной):

, С которым Pygame.событие.насос()

внутренние обработчики событий pygame

pump() -> None

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

эта функция не требуется, если ваша программа последовательно обрабатывает события в очереди через другой pygame.функции события.

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

обратите внимание, что вам не нужно это делать, если вы просто позвоните pygame.event.get() в любом месте вашего основного цикла; если вы этого не сделаете, вы, вероятно, следует называть pygame.event.clear() так что очередь событий не будет заполняться.


могу ли я предложить вместо этого использовать событие que? Это, вероятно, лучшая идея:

while True: #game loop
    for event in pygame.event.get(): #loop through all the current events, such as key presses. 
        if event.type == QUIT:
            die()

        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE: #it's better to have these as multiple statments in case you want to track more than one type of key press in the future. 
                pauseGame()

сделайте что-нибудь вроде этого:

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Hello World')
pygame.mouse.set_visible(1)

done = False
clock = pygame.time.Clock()

while not done:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    key = pygame.key.get_pressed()

    if key[K_ESCAPE]:
        print('\nGame Shuting Down!')

    pygame.display.flip()

, вам не нужен pygame.на if statment, а также вы должны позвонить pygame.display.flip() поэтому он правильно показывает окно, тогда вам нужен цикл событий для выхода из программы


вы должны предоставить версию pygame и python.

я встретил аналогичную проблему, когда я использую pygame 1.9.4dev и python 3.6.5

я исправляю эту проблему после понижения pygame и переустановите python.

Примечание если вы используете pyenv, вы должны убедиться, что --enable-framework опция устанавливается при установке python.

# exit current virtualenv
$ pyenv deactivate
# reinstall python
$ PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.6.5
# And reinstall pygame again.
pip install https://github.com/pygame/pygame/archive/1.9.3.zip

используйте следующий код, чтобы проверить, является ли это работой.

import pygame
import sys


def run():
    """Initialize pygame, settings, and screen object."""
    pygame.init()
    screen = pygame.display.set_mode((300, 200))
    pygame.display.set_caption('Keyboard Test')

    # main loop
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                print('KEY pressed is ' + str(event.key) + '.')

        # Make the most recently drawn screen visible.
        pygame.display.flip()


run()