在pygame中创建一个窗口而不显示它

问题描述 投票:0回答:3

我使用 pygame 创建一个屏幕:

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

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

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

现在,我需要通过将包含所有圆的圆参数的 numpy 数组放入一个循环中,并以一个大数字作为迭代值来随机更改不同圆的不同参数。

我需要在屏幕上重新绘制变异的圆圈(在每次迭代结束时),并将该屏幕再次保存为 png 图像。

现在的问题是,每次我使用

pygame.display.set_mode((width,height))
时,它都会打开显示窗口,并且会显着减慢我的程序速度。

我想创建一个屏幕并将其保存在变量中,但不需要在每次迭代时显示该屏幕。我一直无法弄清楚使用什么命令来避免显示屏幕。

我很感谢你的帮助。

python-2.7 pygame
3个回答
4
投票

如果您不希望出现窗口,请尝试像这样创建表面:

screen = pygame.Surface((width,height))

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


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

0
投票

您可以使用

pygame.surfarray.array3d
对其进行屏幕截图(这可以使用
cv2.cvtColor
转换为 opencv)并使用
pygame.image.save
保存图像,但您需要删除
pygame.display.set_mode
并使用
pygame.Surface
创建 虚拟屏幕

import pygame
import cv2
import numpy as np

pygame.init()

def circle_logic(screen):
    # your logic here
    pass
    
virtual_screen = pygame.Surface((500,500))

count = 0

while True:
    ws = circle_drawing(virtual_screen.copy())
    # screenshot
    screenshot = pygame.surfarray.array3d(virtual_screen)
    # save image to file
    pygame.image.save(virtual_screen, "circles_" + str(count)+".png")
    # convert to opencv (optional)
    screenshot_cv = cv2.cvtColor(screenshot, cv2.COLOR_RGB2BGR)

    count +=1
© www.soinside.com 2019 - 2024. All rights reserved.