Python 2.7 Pygame键被按下
对pygame来说,只要按下一个键,它就可以运行某个东西,这种惯用方式是什么?使用Python 2.7 Pygame键被按下,python-2.7,keyboard,pygame,Python 2.7,Keyboard,Pygame,对pygame来说,只要按下一个键,它就可以运行某个东西,这种惯用方式是什么?使用pygame.key.get_pressed()[pygame.K_p]==True或pygame.mouse.get_pressed()==(1,0,0)它似乎只在按键或按钮按下时才会做出反应。例如,应该使用while循环吗 我运行下面的代码,仅在按下键/按钮时才会在shell中打印: def main(): done = True while done: for i in pygame.event.ge
pygame.key.get_pressed()[pygame.K_p]==True
或pygame.mouse.get_pressed()==(1,0,0)
它似乎只在按键或按钮按下时才会做出反应。例如,应该使用while
循环吗
我运行下面的代码,仅在按下键/按钮时才会在shell中打印:
def main():
done = True
while done:
for i in pygame.event.get():
if pygame.key.get_pressed()[pygame.K_a] == 1:
print "Key a is being pressed..."
elif i.type == KEYDOWN and i.key == pygame.K_q:
done = 0
pygame.display.update()
pygame.quit()
main()
事件
KEYDOWN
表示“按键状态从上到下发生变化”-并不表示“一直按住按键”
当您开始按键时,它会生成eventKEYDOWN
和pygame.event.get()
返回非空列表-如果pygame.event.get()
当您按住键时-它不会生成事件KEYDOWN
,pygame.event.get()
返回空列表-如果pygame.event.get(),循环不执行
您的代码应该如下所示
running = True
while running:
# check events
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == pygame.K_q:
running = False
# do it outside of `for event` loop
# it is executed many times
if pygame.key.get_pressed()[pygame.K_a]:
print "Key is hold pressed..."
pygame.display.update()
或者-当您只需要执行一次某个操作时
key_A_pressed = False
running = True
while running:
# check events
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == pygame.K_q:
running = False
elif event.key == pygame.K_a:
key_A_pressed = True
# it is executed only once
print "Key A - start pressing"
if event.type == KEYUP:
if event.key == pygame.K_a:
key_A_pressed = False
# it is executed only once
print "Key A - stop pressing"
# do it only once - outside of `for event` loop
# it is executed many times
#if pygame.key.get_pressed()[pygame.K_a]:
# or
if key_A_pressed:
print "Key A is held pressed..."
pygame.display.update()
你应使用:
def main():
done = False
while not done:
for i in pygame.event.get():
if i.type == KEYDOWN and i.key == pygame.K_q:
done = True
pressed = pygame.key.get_pressed()
if pressed[pygame.K_a]:
print "Key a is being pressed..."
pygame.display.update()
pygame.quit()
if __name__ == '__main__':
main()
代码中的问题是,只有在迭代所有接收到的事件时才检查按键;因此,如果没有事件发生,将永远无法执行print“按键a…”
部分
把它放在事件循环之外
此外,您不需要显式地与True
进行比较;惯用的/python式的方法是,如果按下[pygame.K_a]:
不要使用get_pressed()。。。在pygame.event.get()中
。如果有很多事件,您将重复多次函数,如果没有事件,您将重复零次函数。谢谢您的回答。我想这对我来说是个误会;这意味着键.get_pressed
应该在每个循环时刷新,以便提供连续的输出?那么,该选项与在while循环之外编写if event.type==KEYDOWN和event.key==pygame.K_a
有什么区别呢?我尝试了这两种方法,它们似乎都有相同的效果。当你按下一个键时,会生成一个KEYDOWN
事件。如果释放钥匙,将生成KEYUP
事件。按住键不会创建新事件(除非启用键重复,这是不应该的)。你能举一个例子,明确地说,key.get_pressed
应该是优先选择的吗?每次你想知道某个键是否被按下时(通常是指:如果按下左箭头,继续向左移动)。谢谢,如果我理解正确,那么按住某个键或按钮不算是一个事件?所以您没有使用pygame.key。是否完全没有按下
?如果可以用event.type==KEYDOWN
来刺激保持这样的距离,那么应该在何时何地使用它?