Pygame中完全透明的窗口?

Posted

技术标签:

【中文标题】Pygame中完全透明的窗口?【英文标题】:Fully transparent windows in Pygame? 【发布时间】:2022-01-02 13:35:07 【问题描述】:

是否可以在 Pygame 中获得一个完全透明的窗口(通过它查看桌面)?我已经找到了如何创建一个没有框架的窗口,但似乎没有任何明显的方法可以使其透明。

只要有适用于 Windows 和 Mac OS X 的解决方案,我愿意加入特定于系统的技术/框架,但我不确定该往哪个方向发展。

我能找到的唯一主题recommended using wxPython,这不是我能为这个特定项目做的事情(需要是 Pygame)。

【问题讨论】:

【参考方案1】:

在 Windows 上,您可以创建纯色背景颜色,然后使用 Win32 API 函数 SetLayeredWindowAttributes() 设置窗口的透明度颜色。 (调用pywin32)

代码:

import pygame
import win32api
import win32con
import win32gui

pygame.init()
screen = pygame.display.set_mode((800, 600)) # For borderless, use pygame.NOFRAME
done = False
fuchsia = (255, 0, 128)  # Transparency color
dark_red = (139, 0, 0)

# Create layered window
hwnd = pygame.display.get_wm_info()["window"]
win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE,
                       win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) | win32con.WS_EX_LAYERED)
# Set window transparency color
win32gui.SetLayeredWindowAttributes(hwnd, win32api.RGB(*fuchsia), 0, win32con.LWA_COLORKEY)

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    screen.fill(fuchsia)  # Transparent background
    pygame.draw.rect(screen, dark_red, pygame.Rect(30, 30, 60, 60))
    pygame.display.update()

结果:

说明:

使用您的透明颜色的窗口的任何部分都将完全透明。您可以查看位于游戏窗口后面的任何桌面图标或程序并与之交互。

要移除窗口边框,可以将Pygame的显示模式设置为NOFRAME

screen = pygame.display.set_mode((800, 600), pygame.NOFRAME)

另请参阅:

堆栈溢出:Make a window transparent using Win32? 堆栈溢出:Transparent hwnd window 微软:Layered Windows 微软:SetLayeredWindowAttributes function

【讨论】:

非常感谢。你能提供一些关于你在这个例子中使用的方法的资源吗? @N.S 我的资源链接在 See Also 部分。 这非常有帮助,非常感谢,+1,顺便问一下,有没有办法在 Linux 上执行此操作或类似的操作? @whaleshark 我不知道。我不熟悉 Linux 桌面 API。【参考方案2】:

PyGame 使用 SDL,它不支持透明窗口。尽管至少在 Linux 上使其透明是由窗口管理器完成的,而不是应用程序。

【讨论】:

没错,通常 WM 确实提供透明效果,但应用程序也可以显式启用透明。 urxvt 就是此类应用程序的一个示例。 真的 urxvt 是假透明的。它只能与您的桌面背景融合,不能与其他窗口融合。所以答案是否定的。 当我以全屏方式打开 urxvt 且后面有另一个窗口时,它同时显示背景和窗口

以上是关于Pygame中完全透明的窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何在pygame中制作具有透明背景的表面

Pygame:允许点击通过窗口

如何使用 pygame 在 Python 中保持 png 图像的透明度? [复制]

PyGame:具有每像素 alpha 的半透明精灵

求助,关于Qt的窗口半透明,窗口上的空间不透明

如何在 Pygame 中将具有一定透明度的 PNG 粘贴到表面上? [复制]