小能豆

Pygame:显示直到延迟后才更新

py

我在编写的程序中第一次调用时出现一个错误:

pygame.display.update()

然后我打电话:

pygame.time.wait(5000)

我希望程序更新显示,然后等待一段时间再继续。但是出于某种原因,显示仅在等待时间之后更新,而不是在此之前。

我附加了一些示例代码来演示正在发生的事情:

import pygame
pygame.init()

white = (255,255,255)
black = (0,0,0)
green = (0,255,0)

screenSize = screenWidth, screenHeight = 200, 200
screen = pygame.display.set_mode(screenSize)
screen.fill(white)

pygame.draw.rect(screen, black,((50,50),(50,50)))
pygame.display.update()
pygame.time.wait(5000)

pygame.quit()
raise SystemExit

这应该创建一个带有黑色框的白色窗口,然后等待 5 秒钟然后退出。

然而它实际上做的是创建一个窗口,等待 5 秒钟,然后一瞬间框就会出现,然后它立即退出。

有谁知道如何解决这个问题?


阅读 28

收藏
2024-11-15

共1个答案

小能豆

您遇到的问题源于pygame.display.update()pygame.time.wait()事件循环和显示缓冲区交互的方式。

您的代码中发生了什么:

  1. screen.fill(white)用白色填充屏幕,这样就很好了。
  2. pygame.draw.rect(screen, black,((50,50),(50,50)))绘制黑色矩形。
  3. pygame.display.update()尝试更新显示,但仅在程序完成执行后续行后才将图像推送到屏幕。
  4. pygame.time.wait(5000)导致程序暂停5秒,在此期间显示锁定在当前状态(即屏幕不会发生变化)。
  5. 最后,等待5秒后,黑框出现一小段时间,程序退出。

为何发生这种情况:

  • pygame.display.update()更新屏幕但不立即强制窗口刷新。屏幕更新被延迟,直到程序继续执行其他代码之后。
  • pygame.time.wait(5000)暂停程序 5 秒,但由于程序处于阻塞状态,因此在此期间不会发生其他更新。等待结束后,pygame.quit()将调用并关闭窗口。

如何修复此问题:

你需要确保在程序等待之前屏幕已经更新并显示。正确的做法是让事件循环处理更新,然后让程序等待指定的时间。

解决方案 1:使用pygame.time.delay()

不要使用pygame.time.wait(),而要使用pygame.time.delay(),它不会阻塞整个事件循环并允许呈现更新。

import pygame
pygame.init()

white = (255, 255, 255)
black = (0, 0, 0)

screenSize = screenWidth, screenHeight = 200, 200
screen = pygame.display.set_mode(screenSize)
screen.fill(white)

pygame.draw.rect(screen, black, (50, 50, 50, 50))
pygame.display.update()  # Immediately update the display

pygame.time.delay(5000)  # Delay without blocking events

pygame.quit()
raise SystemExit

解决方案 2:使用pygame.event.pump()

如果您正在使用pygame.time.wait()并且需要确保在等待之前显示更新,您可以手动抽取事件:

import pygame
pygame.init()

white = (255, 255, 255)
black = (0, 0, 0)

screenSize = screenWidth, screenHeight = 200, 200
screen = pygame.display.set_mode(screenSize)
screen.fill(white)

pygame.draw.rect(screen, black, (50, 50, 50, 50))
pygame.display.update()  # This will update the display immediately

# Manually pump events to allow the display to refresh before waiting
pygame.event.pump()

pygame.time.wait(5000)  # Wait for 5 seconds

pygame.quit()
raise SystemExit

解释pygame.event.pump()

  • 即使您调用像这样的阻塞函数,该pygame.event.pump()函数也能确保处理事件(例如显示更新、鼠标事件等)pygame.time.wait()
  • 通过在等待之前调用pygame.event.pump(),您可以允许屏幕立即呈现更新。

结论:

  • 选项 1pygame.time.delay(5000)非阻塞,如果您只是等待的话,这是最好的方法。
  • 选项 2pygame.time.wait(5000) :如果您出于某种原因更喜欢使用,请pygame.event.pump()在等待之前使用以确保显示得到更新。
2024-11-15