pygame.key.get_pressed()不起作用

时间:2013-07-30 04:12:51

标签: python pygame

我在Stack Overflow上读过类似的问题,但他们没有帮助。这是我的代码:

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 个答案:

答案 0 :(得分:13)

问题是你不处理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.event.pump()

     

内部处理pygame事件处理程序

     

pump() -> None

     

对于游戏的每一帧,您需要对事件队列进行某种调用。这可以确保您的程序可以在内部与操作系统的其余部分进行交互。 如果您没有在游戏中使用其他事件功能,则应调用pygame.event.pump()以允许pygame处理内部行动。

     

如果程序通过其他pygame.event函数一致地处理队列中的事件,则不需要此函数。

     

必须在事件队列内部处理重要事项。主窗口可能需要重新绘制或响应系统。 如果您未能长时间调用事件队列,系统可能会决定您的程序已锁定

请注意,如果您只是在主循环中的任何位置调用pygame.event.get(),则不必执行此操作;如果不这样做,您应该调用pygame.event.clear(),这样事件队列就不会填满。

答案 1 :(得分:2)

我建议使用事件代替吗?这可能是一个更好的主意:

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

答案 2 :(得分:0)

做这样的事情:

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

你在if语句中不需要pygame.,你也应该调用pygame.display.flip()以便它正确地显示窗口然后你需要一个事件循环来退出程序

答案 3 :(得分:0)

您应提供pygamepython的版本。

使用pygame 1.9.4devpython 3.6.5时遇到了类似的问题

我将pygame降级并重新安装python后,已解决此问题。

注意:如果您使用pyenv,则必须确保在安装python时设置了--enable-framework选项。

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