Python pygame.event.get_pressed()未更新

Python pygame.event.get_pressed()未更新,python,pygame,Python,Pygame,我有一个程序,画一个缩小的绿色圆圈,当你按p键时,圆圈消失,出现一条红线。但当我再次按下p键时,绿色圆圈应该会重新出现,但它不会 每当我在第一次按p之后调用pygame.event.get_pressed()函数时,它总是返回相同的值。我是否必须使用某种键盘重置来重新正确读取get\u pressed()方法 这是我的密码: import pygame import time BLACK = (0,0,0) WHITE = (255,255,255) GREEN = (0,255,0) RED

我有一个程序,画一个缩小的绿色圆圈,当你按p键时,圆圈消失,出现一条红线。但当我再次按下p键时,绿色圆圈应该会重新出现,但它不会


每当我在第一次按p之后调用
pygame.event.get_pressed()
函数时,它总是返回相同的值。我是否必须使用某种键盘重置来重新正确读取
get\u pressed()
方法

这是我的密码:

import pygame
import time

BLACK = (0,0,0)
WHITE = (255,255,255)
GREEN = (0,255,0)
RED = (255,0,0)

pygame.init()

size = (700,700)
screen = pygame.display.set_mode(size)
screennumber = 1

pygame.display.set_caption("Game Test")

running = True
width = 350

clock = pygame.time.Clock()

while running:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False

screen.fill(BLACK)

pressed = pygame.key.get_pressed()
print(pressed)

if pressed[pygame.K_p]:
    screennumber = 2
else:
    screennumber = 1

if screennumber == 1:

    pygame.draw.circle(screen,GREEN,[350,350], width,1)

    pygame.display.flip()

    if width>1:
        width = width-1

if screennumber == 2:

        time.sleep(0.25)
        pause = True
        while pause:
            pressed = pygame.key.get_pressed()
            print(pressed)
            if pressed[pygame.K_r]:
                pause = False

            pygame.draw.line(screen,RED,[0,0],[700,700],5)

            pygame.display.flip()

            clock.tick(21)


pygame.display.flip()

clock.tick(21)


pygame.quit()

谢谢

pygame.key.get_pressed()
调用其中一个事件函数时更新。将
pygame.event.pump()
放入您的
中,同时暂停:
循环,它将正常工作
pygame.event.pump()
告诉pygame您不想使用事件,但它应该处理内部操作

但当前,当红线出现时,您的程序不会响应任何事件(您甚至无法关闭窗口),因此我建议在暂停时在
中设置一个事件循环:
阻止检查
pygame.QUIT
事件


此外,如果您不定期调用其中一个事件函数,操作系统会认为您的程序已崩溃。

使用
pygame.key.get\u pressed
不是实时处理按键的可靠方法。函数返回一个字典,其中包含函数调用时键盘的状态。但是,如果在两次通话之间按下并释放某个键,字典将与根本没有按下该键一样。 检查用户是否按键的更好方法是在事件循环中处理
pygame.KEYDOWN
事件。然后检查
KEYDOWN
是否为所需的钥匙

以下是您的程序版本,分为三个部分:1)处理事件,2)更新游戏元素,3)绘制到屏幕

import pygame
import time

BLACK = (0,0,0)
WHITE = (255,255,255)
GREEN = (0,255,0)
RED = (255,0,0)

pygame.init()

size = (700,700)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Game Test")

running = True
width = 350
paused = False

clock = pygame.time.Clock()

while running:

    # process all events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        # -- HERE IS THE RELEVANT SECTION --
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_p:
                paused = not(paused)

    # update everything
    if not paused:
        if width > 1:
            width = width-1

    # draw everything
    screen.fill(BLACK)
    if not paused:
        pygame.draw.circle(screen,GREEN,[350,350], width,1)
    else:
        pygame.draw.line(screen,RED,[0,0],[700,700],5)
    pygame.display.flip()

    # update the clock
    clock.tick(21)


pygame.quit()

如果您对此代码有任何疑问,请告诉我

是否应该在块调用
pygame.event.get()
后缩进其余代码(退出除外)?我猜在读取新事件之前,
pygame.key.get_pressed()
不会更新。
pygame.event.get_pressed
获取函数调用时键盘的状态。它对于检查用户是否在最后一帧内按下某个键没有用处,因为自上次调用以来按下和释放的键的状态仍然是
False
。相反,OP应该处理事件循环中所有必要的事件。是的,通常最好使用中所述的事件循环。