2012-04-12 90 views
3

基本上我有一個循環(剔,set_caption,screen_fill,event.get(),send_frame_event,翻轉,重複)爲什麼在移動/拖動窗口時,pygame會凍結在pygame.event.get()上?

當我周圍拖動窗口在Windows 7中,循環停止循環,最後我被困在pygame.event.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 

完整的代碼在:http://pastie.org/private/wm5vqq3f7xe0xlffy1fq

+0

這是把'pygame.event's一會兒真循環中的主體一個很好的做法。 – hjpotter92 2012-04-12 11:08:15

+1

他們實際上是。這樣做沒有區別。除非你的意思是在另一個線程? – 2012-04-12 11:58:07

回答

0

不知道這是否會幫助與否:

我意識到這個問題是與移動窗口窗口,而不是重新調整窗口的大小。 也許在移動和重新調整大小之間有一些相似之處?

我發現這個文檔中上調整大小:

然後,顯示模式被設定,幾個事件被放置在pygame的事件隊列。 pygame.QUIT在用戶請求程序關閉時發送。當顯示器獲得並失去輸入焦點時,該窗口將接收pygame.ACTIVEEVENT事件。如果顯示設置爲pygame.RESIZABLE標誌,則當用戶調整窗口尺寸時,將發送pygame.VIDEORESIZE事件。直接繪製到屏幕上的硬件顯示將會在窗口部分必須重繪時得到pygame.VIDEOEXPOSE事件。

和:

注意,當用戶調整遊戲窗口,pygame中不會自動更新其內部屏幕表面。每次發送VIDEORESIZE時都必須調用set_mode()。這在文檔中應該更清楚。

也許當移動遊戲窗口時,類似的事情發生?

+0

問題是pygame.event.get()被有效阻止。 – 2012-04-12 20:35:58

1

嘗試發出呼叫pygame.event.pump()你的主循環裏(或handleEvents功能)

+0

「如果您的程序通過其他pygame.event函數始終處理隊列上的事件,則此功能不是必需的。」 http://www.pygame.org/docs/ref/event.html#pygame.event.pump 儘管我爲了完整起見而回家,但我會嘗試一下。 – 2012-04-12 20:34:26

+0

這就是爲什麼我寫「嘗試」的原因 - 在不調用event.pump時,我似乎在不同系統之間出現了一些不穩定的行爲和差異 - 所以我習慣了總是對它進行調用。 – jsbueno 2012-04-13 02:40:39