请问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???
本人不太懂,请教高手指点… …