Полностью прозрачные окна в Pygame?
Вопрос
Можно ли получить в Pygame полностью прозрачное окно (через него можно видеть рабочий стол)?Я нашел, как создать окно без рамки, но очевидного способа сделать его прозрачным не существует.
Я был бы готов использовать специфичные для системы технологии/фреймворки, если есть решения как для Windows, так и для Mac OS X, но я не уверен, в каком направлении смотреть.
Единственная тема, которую я смог найти рекомендуется использовать wxPython, чего я не могу сделать для этого конкретного проекта (должен быть Pygame).
Решение
PyGame использует SDL, который не поддерживает прозрачные окна.Хотя, по крайней мере, в Linux обеспечение прозрачности осуществляется оконным менеджером, а не приложением.
Другие советы
В 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)
# 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()
Результат:
Объяснение:
Любая часть окна, использующая ваш цвет прозрачности, будет полностью прозрачной.Вы можете просматривать и взаимодействовать с любыми значками на рабочем столе или программами, расположенными за окном игры.
Чтобы удалить границу окна, вы можете установить режим отображения Pygame на NOFRAME
.
screen = pygame.display.set_mode((800, 600), pygame.NOFRAME)
Смотрите также:
- Переполнение стека: Сделать окно прозрачным с помощью Win32?
- Переполнение стека: Прозрачное окно
- Майкрософт: Многослойные окна
- Майкрософт: Функция SetLayeredWindowAttributes