簡體   English   中英

Pygame window 幾秒鍾后沒有響應

[英]Pygame window not responding after a few seconds

幾秒后(大約 5 秒),這段簡單的代碼崩潰了(window 沒有響應)。

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 24)
#clock = pygame.time.Clock()

#font = pygame.font.Font(None, 32)

cycles = 0
while True:
    screen.fill(0)
#    text = font.render('Cycles : %d' % cycles, True, (255, 255, 255))
#    screen.blit(text, (100, 100))

    cycles += 1

    pygame.display.update()

如果我取消注釋注釋行,我可以清楚地看到程序在顯示 47 到 50 之間的值時失去控制。

我使用 python 2.7 和 pygame 1.9.2、Windows 8(64 位)和 Eclipse + PyDev。

在 while 循環開始時調用pygame.event.get()

您需要定期調用pygame.event模塊中的四個函數之一,以便 pygame 在內部與您的操作系統交互。 否則操作系統會認為您的游戲已經崩潰。 因此,請確保您調用以下方法之一:

  • pygame.event.get()返回當前在事件隊列中的所有事件的列表。
  • pygame.event.poll()從事件隊列或pygame.NOEVENT如果隊列為空返回單個事件。
  • pygame.event.wait()從事件隊列中返回單個事件或等待直到可以返回事件。
  • pygame.event.pump()允許 pygame 處理內部操作。 當您不想處理來自事件隊列的事件時很有用。

窗口不響應(凍結),因為您不處理事件。 您必須通過pygame.event.pump()pygame.event.get()處理事件,以保持窗口響應。

請參閱pygame.event.pump()的文檔:

對於游戲的每一幀,您都需要對事件隊列進行某種調用。 這確保您的程序可以在內部與操作系統的其余部分進行交互。

添加一個事件循環,例如:

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    # [...]

或者只是抽事件:

while True:
    pygame.event.pump()

    # [...]

最小的例子: repl.it/@Rabbid76/PyGame-MinimalApplicationLoop

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM