在Pygame中创建一个窗口,但不显示它

4

我使用以下代码在pygame中创建屏幕:

screen = pygame.display.set_mode((width,height))

然后我在画布上随机绘制了200个灰度圆形,并将屏幕保存为图像。(我需要将此屏幕保存为图像,以便稍后与目标图像进行比较):

pygame.image.save(screen, "Circles.png")

现在,我需要通过将包含所有圆的圆参数的 numpy 数组放入循环中,并将其迭代值设置为一个大数来随机更改不同圆的不同参数。
每次迭代结束后,我需要在屏幕上重新绘制变异的圆,并将该屏幕保存为 png 图像。
现在的问题是,每次使用 pygame.display.set_mode((width,height)) 都会打开显示窗口并显著减慢我的程序速度。
我想创建一个屏幕并将其保存在变量中,但不需要在每次迭代时显示该屏幕。 我还没有找到用于避免显示屏幕的命令。
感谢您的帮助。

我很好奇为什么你一直在创建新的显示器而不是修改现有的。这样做也会限制显示器的更新能力,除非你调用显示器的更新函数。 - oxrock
我对Python和Pygame都很陌生,这是我能想到的最好的代码了。我相信有更好的编写方式。但基本上我需要做的是在每次迭代中更改屏幕上某些圆形的参数,然后将屏幕保存为图像。然后获取该图像的像素值,将其与目标图像的像素值进行比较并计算适应度值。 - Mary
@Mary:正如oxrock所说,你不需要在每次迭代中创建一个新的屏幕表面。对于快速而简单的方法,你可以填充你的屏幕(调用screen.fill()),绘制圆形并使用PyGames pygame.display.flip() 方法更新整个屏幕。之后,你可以将屏幕保存为图像。希望这能帮到你 :) - elegent
@oxrock 和 elegent:我把 pygame.display.flip() 放在循环外面。这样,在所有圆形修改完成后,我才更新屏幕,而不是在每次修改后都更新它。非常感谢你们的提示。现在我的程序运行速度快多了,但我仍在寻找一种完全停止屏幕弹出并仅将其保存为图像,然后从中提取像素值的方法。 - Mary
2个回答

4
如果你不想要弹出一个窗口,可以尝试按照下方方式创建表面(surface):
screen = pygame.Surface((width,height))

然后,您可以在此表面上绘制您的圆形,并以与之前相同的方式保存它。正如其他人所说,使用fill()方法清除表面。


据我所知,在pygame中,直到显示表面被配置之前,你无法创建任何表面。不过这只是根据我的记忆,不能保证100%正确。 - oxrock
你可以创建表面,但是有一些限制,例如convert()无法使用。不过,绘制圆形和保存图像应该是可行的。 - user2746752

1
我可能会使用类似这样的东西。这仍然会弹出一个屏幕,但它会很小并且永远不会更新。
import pygame
from pygame.locals import *

pygame.init()

def circle_drawing(surf):
    pass
    #your circle drawing function using passed in surface

DISPLAY = (1, 1)
DEPTH = 32
FLAGS = 0
screen = pygame.display.set_mode(DISPLAY, FLAGS, DEPTH)
work_surface  = pygame.Surface((500,500))
count = 0
while True:
    ws = circle_drawing(work_surface.copy())
    pygame.image.save(ws, "circles_" + str(count)+".png")
    count +=1

我需要透明的圆形,所以我必须在单独的表面上绘制每个圆形,然后将该表面传输到这个新表面上,而不是传输到屏幕上,但它起作用了!我运行了50次迭代,速度相当快。现在我需要实现其余的代码,并运行大约150,000次迭代。我会在这里发布结果。非常感谢您的帮助! - Mary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接