Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pygame轮询键盘脱离主事件循环_Python_Events_Keyboard_Pygame - Fatal编程技术网

Python pygame轮询键盘脱离主事件循环

Python pygame轮询键盘脱离主事件循环,python,events,keyboard,pygame,Python,Events,Keyboard,Pygame,我想知道如何在pygame中而不是在主事件循环中轮询键盘 我想这样做是因为我想能够从所有类中读取游戏中的事件(不仅仅是在主类中)。我试过了,但没用。我打字的时候它不打印字母 代码如下: 您的示例代码看起来不错,但在main循环中缺少调用dopygame.event.pump()。尝试添加这样的呼叫 另外,您的if pygame.event.poll()行不应该在for event循环中吗?按照编写方式,它只需检查最后一个可用事件是否为“键盘”类型 除此之外,没有什么可以阻止您在主循环中调用的任

我想知道如何在pygame中而不是在主事件循环中轮询键盘

我想这样做是因为我想能够从所有类中读取游戏中的事件(不仅仅是在主类中)。我试过了,但没用。我打字的时候它不打印字母

代码如下:



您的示例代码看起来不错,但在main循环中缺少调用do
pygame.event.pump()
。尝试添加这样的呼叫

另外,您的
if pygame.event.poll()
行不应该在
for event
循环中吗?按照编写方式,它只需检查最后一个可用事件是否为“键盘”类型


除此之外,没有什么可以阻止您在主循环中调用的任何函数或方法中调用
pygame.event.poll
以从主循环代码中获取键盘事件(并且它本身有一个子循环)。

for循环正在调用event.get(),这将清除事件队列。因此,在尝试event.poll()之后,您可能会得到一个NOEVENT,因为队列是空的。而event.poll()只会得到一个事件,我相信是队列中的第一个事件。因此,获取KEYDOWN事件的唯一方法是,它发生在for循环处理其他事件时,并且在KEYDOWN事件和调用event.get()之间没有发生其他事件


我不清楚为什么要避免事件循环,但为了得到想要的结果,我会将for循环更改为if语句检查pygame.event.get(pygame.QUIT)(您只需要知道是否有一个),并将if语句更改为pygame.event.get(pygame.KEYDOWN)(以防需要处理多个KEYDOWN)。然后添加一个pygame.event.pump()调用以清除队列中的任何其他事件。

我尝试过,但它仅在我第一次调用它们时才识别出这些事件,因为poll会从队列中删除事件,因此如果您在删除事件后检查它们,并且在另一个问题中询问重用pygame事件时无法再次检查它们,我已经回答了-
import sys, pygame
from pygame.locals import *
class test():
    pygame.init()
    pygame.font.init()
    screen=pygame.display.set_mode((768, 576))
    pygame.display.set_caption("test")
    clock = pygame.time.Clock()
    while True:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT: sys.exit()
        if pygame.event.poll().type==pygame.KEYDOWN:
            print "a" 
        screen.fill((0,0,0))
        pygame.display.flip()