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).
There are three types of transparency supported in pygame: colorkeys, surface alphas, and pixel alphas. Surface alphas can be mixed with colorkeys, but an image with per pixel alphas cannot use the other modes. Colorkey transparency makes a single color value transparent.
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)
# 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()
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:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With