请问Pygame,这是个BUG吗?

本文通过对比两段仅一处不同的Pygame代码,展示了KEYUP和KEYDOWN事件在处理键盘输入时的不同行为。第一段代码中,KEYUP事件被正常POST并输出,而KEYDOWN事件在第二段代码中多数未POST回事件队列,导致大部分KeyDown事件丢失。这引发了对Pygame事件处理机制是否存在问题的疑问,可能是由于同一键的KeyDown事件不允许出现在KeyUp之后,或者是Pygame事件包的潜在BUG。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请问Pygame:KEYUP与KEYDOWN结果不同,这是个BUG吗?

1. 先看第一段代码:

import pygame
from pygame.locals import *

def check4exit_game():
    for event in pygame.event.get(QUIT):
        print("检测到关闭窗口操作,程序退出!!!")
    for event in pygame.event.get(KEYUP):  # TODO: 有变化的位置
        if event.key == K_ESCAPE:
            print("检测到ESC键放开,程序退出......")
        pygame.event.post(event)

def any_key2continue():
    while True:
        pygame.time.wait(100)
        pygame.display.update()
        check4exit_game()
        for event in pygame.event.get([KEYDOWN, KEYUP]):
            print(event)
            if event.key == K_q:
                return


if __name__ == "__main__":
    pygame.init()
    screen = pygame.display.set_mode((240, 200))
    screen.fill((150, 150, 150))
    any_key2continue()

请看输出结果:

pygame 2.0.0.dev6 (SDL 2.0.10, python 3.8.5)
Hello from the pygame community. https://www.pygame.org/contribute.html
ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred
<Event(768-KeyDown {'unicode': '', 'key': 27, 'mod': 0, 'scancode': 41, 'window': None})>
检测到ESC键放开,程序退出......
<Event(769-KeyUp {'key': 27, 'mod': 0, 'scancode': 41, 'window': None})>
检测到关闭窗口操作,程序退出!!!
检测到关闭窗口操作,程序退出!!!
<Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>
<Event(769-KeyUp {'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>
<Event(768-KeyDown {'unicode': 'G', 'key': 103, 'mod': 8192, 'scancode': 10, 'window': None})>
<Event(769-KeyUp {'key': 103, 'mod': 8192, 'scancode': 10, 'window': None})>
<Event(768-KeyDown {'unicode': 'K', 'key': 106, 'mod': 8192, 'scancode': 13, 'window': None})>
<Event(769-KeyUp {'key': 107, 'mod': 8192, 'scancode': 14, 'window': None})>

2. 再来看第二段代码:

import pygame
from pygame.locals import *

def check4exit_game():
    for event in pygame.event.get(QUIT):
        print("检测到关闭窗口操作,程序退出!!!")
    for event in pygame.event.get(KEYDOWN):  # TODO: KEYUP改成了KEYDOWN
        if event.key == K_ESCAPE:
            print("检测到ESC键放开,程序退出......")
        pygame.event.post(event)

def any_key2continue():
    while True:
        pygame.time.wait(100)
        pygame.display.update()
        check4exit_game()
        for event in pygame.event.get([KEYDOWN, KEYUP]):
            print(event)
            if event.key == K_q:
                return


if __name__ == "__main__":
    pygame.init()
    screen = pygame.display.set_mode((240, 200))
    screen.fill((150, 150, 150))
    any_key2continue()

请看第二段代码的输出结果:

pygame 2.0.0.dev6 (SDL 2.0.10, python 3.8.5)
Hello from the pygame community. https://www.pygame.org/contribute.html
检测到ESC键放开,程序退出......
<Event(769-KeyUp {'key': 27, 'mod': 0, 'scancode': 41, 'window': None})>
检测到关闭窗口操作,程序退出!!!
检测到关闭窗口操作,程序退出!!!
<Event(769-KeyUp {'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>
<Event(769-KeyUp {'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>
<Event(769-KeyUp {'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>
<Event(768-KeyDown {'unicode': 'h', 'key': 104, 'mod': 0, 'scancode': 11, 'window': None})>
<Event(769-KeyUp {'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>
<Event(769-KeyUp {'key': 104, 'mod': 0, 'scancode': 11, 'window': None})>
<Event(769-KeyUp {'key': 103, 'mod': 0, 'scancode': 10, 'window': None})>
<Event(769-KeyUp {'key': 106, 'mod': 0, 'scancode': 13, 'window': None})>
<Event(769-KeyUp {'key': 106, 'mod': 8192, 'scancode': 13, 'window': None})>
<Event(769-KeyUp {'key': 106, 'mod': 8192, 'scancode': 13, 'window': None})>
<Event(769-KeyUp {'key': 106, 'mod': 8192, 'scancode': 13, 'window': None})>
<Event(769-KeyUp {'key': 106, 'mod': 8192, 'scancode': 13, 'window': None})>
<Event(768-KeyDown {'unicode': 'J', 'key': 106, 'mod': 8192, 'scancode': 13, 'window': None})>
<Event(769-KeyUp {'key': 108, 'mod': 8192, 'scancode': 15, 'window': None})>
<Event(769-KeyUp {'key': 107, 'mod': 8192, 'scancode': 14, 'window': None})>
<Event(769-KeyUp {'key': 106, 'mod': 8192, 'scancode': 13, 'window': None})>
<Event(769-KeyUp {'key': 104, 'mod': 8192, 'scancode': 11, 'window': None})>
<Event(768-KeyDown {'unicode': 'L', 'key': 108, 'mod': 8192, 'scancode': 15, 'window': None})>
<Event(769-KeyUp {'key': 108, 'mod': 8192, 'scancode': 15, 'window': None})>
<Event(769-KeyUp {'key': 106, 'mod': 8192, 'scancode': 13, 'window': None})>
<Event(769-KeyUp {'key': 104, 'mod': 8192, 'scancode': 11, 'window': None})>
<Event(769-KeyUp {'key': 103, 'mod': 8192, 'scancode': 10, 'window': None})>

稍稍给的长了一点儿,请耐心看完… …

3. 两段代码只有一处不同,就是下面这一行:

	for event in pygame.event.get(KEYUP):

只有在取事件时,第一段取的是KEYUP,第二段取的是KEYDOWN,其余代码未做任何改动!

但输出结果却有很大的差别,从第一段代码的输出结果可以看出,取出的KEYUP事件被成功的POST进入了事件队列,后正常输出了,输出的KeyDown和KeyUp都是成对出现的;

而第二段代码的输出结果中,取出的KEYDOWN事件,大多数都没有被POST回到事件队列中,只有当操作者同时按下多个键时,才有可能有少数被后来的输出显示出来!输出的绝大多数都KeyUp事件,KeyDown事件被丢掉了!!!

4. 为什么会出现上述结果,也不知道是不是PYGAME包的BUG???

是因为PYGAME的事件处理机制不允许同一键的KeyDown出现在KeyUp之后吗?

还是因为PYGAME的事件处理包有BUG???

本人不太懂,请教高手指点… …

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值