Fully transparent windows in Pygame?

泄露秘密 提交于 2019-12-23 09:09:29

问题


Is it possible to get a fully transparent window in Pygame (see the desktop through it)? I've found how to create a window without a frame, but there doesn't seem to be any obvious way to make it transparent.

I'd be willing to tie into system-specific technology/frameworks as long as there are solutions for both Windows and Mac OS X, but I'm not sure which direction to be looking.

The only topic I was able to find recommended using wxPython, which isn't something I can do for this particular project (needs to be Pygame).


回答1:


PyGame uses SDL, which does not support transparent windows. Although at least on Linux making it transparent is done by the window manager, not the application.




回答2:


On Windows, you can create a solid background color then set the window's transparency color with the Win32 API function SetLayeredWindowAttributes(). (Called with pywin32)

Code:

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)

# Set window transparency color
hwnd = pygame.display.get_wm_info()["window"]
win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE,
                       win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) | win32con.WS_EX_LAYERED)
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()

Result:

Explanation:

Any part of the window using your transparency color will be fully transparent. You can view and interact with any desktop icons or programs located behind your game window.

To remove the window border, you can set Pygame's display mode to NOFRAME.

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

See Also:

  • Stack Overflow: Make a window transparent using Win32?
  • Stack Overflow: Transparent hwnd window
  • Microsoft: Layered Windows
  • Microsoft: SetLayeredWindowAttributes function


来源:https://stackoverflow.com/questions/550001/fully-transparent-windows-in-pygame

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!