Python Pygame中的完全透明窗口?

Python Pygame中的完全透明窗口?,python,graphics,sdl,pygame,Python,Graphics,Sdl,Pygame,有没有可能在Pygame中获得一个完全透明的窗口(通过它查看桌面)?我已经找到了如何创建一个没有框架的窗口,但似乎没有任何明显的方法使其透明 只要Windows和Mac OS X都有解决方案,我愿意与特定于系统的技术/框架相结合,但我不确定该朝哪个方向发展 我能找到的唯一主题是,我不能为这个特定项目做任何事情(需要是Pygame)。Pygame使用SDL,它不支持透明窗口。尽管至少在Linux上,透明化是由窗口管理器完成的,而不是应用程序 在Windows上,可以创建纯色背景色,然后使用Win3

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

只要Windows和Mac OS X都有解决方案,我愿意与特定于系统的技术/框架相结合,但我不确定该朝哪个方向发展


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

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

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

代码:

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()
结果:

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()

说明:

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)
另请参见:

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()
  • 堆栈溢出:
  • 堆栈溢出:
  • 微软:
  • 微软:

True,通常WM确实提供透明效果,但应用程序也可以显式启用透明。urxvt就是这样一个应用程序的例子。实际上,urxvt是伪透明的。它只能与桌面背景混合,不能与其他窗口混合。所以答案完全是否定的。非常感谢。你能提供一些关于你在这个例子中使用的方法的资料吗@注意:我的资源链接在See-allo部分。这非常有用,非常感谢,+1,顺便问一下,在Linux上有没有这样或类似的方法?@whaleshark我不知道。我不熟悉Linux桌面API。