Python 为什么移动/拖动窗口时pygame会冻结在pygame.event.get()处?

Python 为什么移动/拖动窗口时pygame会冻结在pygame.event.get()处?,python,pygame,Python,Pygame,基本上我有一个循环(勾选、设置标题、屏幕填充、event.get()、发送帧事件、翻转、重复) 当我在windows 7上拖动窗口时,循环停止循环,我最终被困在pygame.event.get()中,我尝试仅为get定义某些事件,例如get([pygame.QUIT]),但没有成功 简单地调用pygame.event.clear()在拖动/移动窗口时具有相同的冻结效果 有解决办法吗 不是完整的代码,但应该足够: def start(self): self.running = True

基本上我有一个循环(勾选、设置标题、屏幕填充、event.get()、发送帧事件、翻转、重复)

当我在windows 7上拖动窗口时,循环停止循环,我最终被困在pygame.event.get()中,我尝试仅为get定义某些事件,例如get([pygame.QUIT]),但没有成功

简单地调用pygame.event.clear()在拖动/移动窗口时具有相同的冻结效果

有解决办法吗

不是完整的代码,但应该足够:

def start(self):
    self.running = True
    Clock = pygame.time.Clock()
    while self.running:
        self.p += 25
        tickFPS = Clock.tick(self.fps)
        pygame.display.set_caption("Press Esc to quit. FPS: %.2f" % (Clock.get_fps()))
        self.screen.fill([self.p&0xFF,(255-self.p)&0xFF,255])
        self.handleEvents()
        self.raiseEvent("updateFrame")
        pygame.display.flip()
def handleEvents(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            self.running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                self.running = False

完整代码位于:

不知道这是否有用:

我意识到问题在于移动窗口,而不是重新调整窗口大小。 也许移动和重新调整大小之间有一些相似之处

我在关于重新调整大小的文档中发现了这一点:

然后设置显示模式,在pygame事件队列上放置几个事件。当用户请求关闭程序时,会发送pygame.QUIT。当显示器获得或失去输入焦点时,窗口将接收pygame.ACTIVEEVENT事件。如果显示设置为pygame.Resizeable标志,则当用户调整窗口尺寸时,将发送pygame.VIDEORESIZE事件。当窗口部分必须重新绘制时,直接绘制到屏幕的硬件显示将获得pygame.VIDEOEXPOSE事件

以及:

请注意,当用户调整游戏窗口的大小时,pygame不会自动更新其内部屏幕表面。每次发送VIDEORESIZE时,必须调用set_mode()。这在文档中应该更加清楚


也许在移动游戏窗口时,会发生类似的情况?

尝试在主循环(或handleEvents函数)中调用
pygame.event.pump()

pygame.event
放在主体中的while True循环中是一种很好的做法。它们实际上是。这样做没有什么区别。除非你的意思是在另一个线程中?我在while循环的函数中调用python.event.get()时遇到了这个问题。如果我移动BASH shell,事件将不再打印到shell。“如果您的程序通过其他pygame.event函数一致地处理队列上的事件,则不需要此函数。”但为了完整性起见,我回家后会尝试此函数。这就是我编写“尝试”的原因-在不调用event.pump时,我似乎有一些不稳定的行为以及不同系统之间的差异-因此我习惯于总是调用它。这并没有解决我的问题。即使在将其放入算法后,如果我移动外壳,然后再次开始单击按钮,事件将不再被拾取/问题是pygame.event.get()实际上是阻塞。