首页 > 解决方案 > pygame:最小化和还原时屏幕擦除-下次更新时变为蓝色

问题描述

我写这篇文章是因为,不知从何而来,我的 pygame 程序已经开始起作用了。我对 pygame 并不陌生,我会说我比大多数人更了解它。我已经使用它多年了,不知从哪里冒出这个错误,或者不管它是什么,让我难住了。

问题:按下最小化按钮后,屏幕(即 pygame.display 对象)完全变为空白(灰色)。在调用更新之前它不会显示任何内容,并且当调用该更新时,它会重新绘制以前在其上的所有内容 - 但是它将在所有内容上绘制一个透明的蓝色矩形。

我的屏幕在启动时看起来像这样:

我的屏幕在启动时看起来像这样

最小化和恢复后,它看起来像这样:

最小化还原后是这样的

在调用下一次更新后,我得到了这个:

在调用下一次更新后,我得到了这个

是什么让这成为一个真正令人头疼的事情是这个。无论如何,我认为是时候进行更新了,所以我擦掉了驱动器,重新安装了我的整个操作系统,然后重新安装了 python(3.5 的 3.7)和 pygame(1.9.2 的更少)。所以这个系统是开箱即用的薄荷。

我已经使用 pygame 多年了。我知道我可以用我的方式来解决这个问题(可能只是通过从最小化之前绘制所有内容)但这会增加比我愿意提供的更多的复杂性和开销——特别是因为显然有一些事情发生了。

import pygame, sys
pygame.init()

Screen = pygame.display.set_mode( ( 1200, 700 ), pygame.RESIZABLE, 32 )

pygame.draw.circle( Screen, ( 200, 200, 200 ), ( 600, 350 ), 300, 0 )

pygame.display.update()

while True:

  for event in pygame.event.get():

    if event.type == pygame.QUIT: pygame.quit()

    pygame.display.update()

标签: pythonpygamescreendisplay

解决方案


您可能会收到此错误,因为您没有指定背景颜色,因此,当窗口未更新时,您的操作系统可以使用默认颜色。

虽然我无法在我的计算机(运行 Windows 7)上重现该问题,但我确信只需调用screen.fill()和一些代码移动即可解决问题。

  • 我删除了传递给的额外参数pygame.display.set_mode(),因为它们对我来说似乎没有必要。

  • 我删除了对pygame.draw.circle(),的调用到while循环中,以便每一帧都绘制圆。我删除了第一pygame.display.update()行,因为这行通常应该在while循环结束后,在所有绘制完成之后。

  • 我不确定您发布的代码是否pygame.display.update()正确缩进了第二个,但是此行不应在for循环内运行,而应在循环的每次迭代结束时运行while。所以,我将它移回了一级缩进。

  • 最后,我添加了screen.fill((0, 0, 0))用黑色填充屏幕的行。这一行必须出现在任何将内容绘制到屏幕上的代码行之前,因为这样我们就无法看到刚刚绘制的内容。

该行应该停止 Mac 默认的蓝色背景。

这是固定代码:

import pygame, sys
pygame.init()

screen = pygame.display.set_mode((1200, 700))

while True:

    for event in pygame.event.get():

        if event.type == pygame.QUIT: 
            pygame.quit()
            quit()

    screen.fill((0, 0, 0))
    pygame.draw.circle( screen, ( 200, 200, 200 ), ( 600, 350 ), 300, 0 )
    pygame.display.update()

我希望这个答案对你有所帮助!请让我知道此解决方案是否适合您,如果您有任何其他问题,请随时在下面发表评论!


推荐阅读