Pygame或Python中的透明窗口

3

我正在尝试为我的游戏制作一个透明窗口作为启动画面。图片本身是有透明度的,但我无法使窗口透明(就像看到屏幕、桌面等背景一样)。我发现pygame无法实现这个目标。是否有任何外部库可以使用来实现这个功能?顺便提一下,这完全是一个Linux项目,所以特定于操作系统的解决方案也可以。

#Splash Screen
screen = pygame.display.set_mode((680,300), NOFRAME)
splashbg = pygame.image.load("Images/SplashBG.png")
font = pygame.font.Font(None, 36)

pygame.mixer.music.load("OriginalEnd.mp3")
pygame.mixer.music.play(-1)

screen.blit(splashbg,(0,0))
loadingtext = font.render("Loading...", 1, (255,255,255))
screen.blit(loadingtext, (200,250))
pygame.display.flip()
pygame.time.delay(4000)

根据这个问题,似乎不可能实现完全透明的Pygame窗口...也许在SDL的beta版本中可以实现,但我不知道是否可以让Pygame与不同版本的SDL一起工作。 - 0eggxactly
1
谢谢你提供的链接,它提到了wxPython,我会深入研究一下。就像我说的,它不一定要是pygame函数。 - Amnite
Wxpython确实可以工作,我已经用wxpython做过这个,但它并不是一个优雅的解决方案。它只是复制它后面的像素,所以如果周围的任何东西移动,你就会发现它并不真正透明。此外,wxpython还有一些令人恼火的设计缺陷。对于像启动画面这样简单的东西,我可能仍然会推荐它,但要知道你正在做什么。 - trevorKirkby
相关:Pygame或Python中的透明窗口 - Stevoisiak
2个回答

4

你可以通过使用“假装”透明度来实现。这并不是一个理想的解决方案,但可能会起作用。

在启动屏幕之前,使用PIL对桌面进行快照,并首先绘制该快照,然后在其上绘制透明图像。这样至少会给人以透明的“错觉”。

类似于以下内容:

import ImageGrab, Image 

im = Imagegrab.grab()
im.save('faux_trans.png','png')

for_trans = pygame.image.load('faux_trans.png').convert()

splash = pygame.image.load.... 

screen.blit(for_trans, (0,0))

# and so on. 

就像我说的那样,这不是最好的解决方案,但如果你以NOFRAME或FULLSCREEN方式启动游戏,你可能可以摆脱这个问题! :)


这只是一个临时解决方案。我找不到任何方法使它工作。谢谢,我可能会使用这个... - Amnite

1

如果需要一个跨平台的解决方案,您可以使用Raylib-Python-CFFI库。

Raylib 提供了2D、3D、字体绘制等功能,并且可以在透明窗口上绘制更多内容:

跨平台透明窗口

以上示例的源代码:

from raylib.dynamic import raylib as rl, ffi

rl.SetConfigFlags(rl.FLAG_WINDOW_TRANSPARENT | rl.FLAG_WINDOW_RESIZABLE)
rl.InitWindow(800, 600, b'Transparency Test')


CLEAR = [0] * 4
GREEN = [140, 189, 72, 255]

font_size = 60
camera = ffi.new("struct Camera3D *", [[18.0, 16.0, 18.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0], 45.0, 0])

rl.SetCameraMode(camera[0], rl.CAMERA_ORBITAL)

while not rl.WindowShouldClose():
    rl.UpdateCamera(camera)
    rl.BeginDrawing()
    rl.ClearBackground(CLEAR)
    rl.BeginMode3D(camera[0])
    rl.DrawGrid(20, 1)
    rl.DrawCube([0, 0, 0], 2, 2, 2, GREEN)
    rl.EndMode3D()
    rl.DrawText(b'Hello World', 64, 64, font_size, GREEN)
    rl.EndDrawing()

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