Полностью прозрачные окна в Pygame?

Можно ли получить полностью прозрачное окно в Pygame (видеть через него рабочий стол)? Я нашел, как создать окно без рамки, но, похоже, нет очевидного способа сделать его прозрачным.

Я был бы готов привязаться к системным технологиям/фреймворкам, пока есть решения как для Windows, так и для Mac OS X, но я не уверен, в каком направлении искать.

Единственная тема, которую мне удалось найти, рекомендовала использовать wxPython, но я не может сделать для этого конкретного проекта (должен быть Pygame).


person One Crayon    schedule 14.02.2009    source источник


Ответы (2)


PyGame использует SDL, который не поддерживает прозрачные окна. Хотя, по крайней мере, в Linux прозрачность делает оконный менеджер, а не приложение.

person justinhj    schedule 14.02.2009
comment
Правда, обычно WM предоставляет эффекты прозрачности, но приложения также могут явно включать прозрачность. urxvt является примером такого приложения. - person Alec Thomas; 15.02.2009
comment
Действительно urxvt фейково-прозрачный. Он может сочетаться только с фоном вашего рабочего стола, но не с другими окнами. Так что ответ полностью НЕТ. - person Anton Chikin; 01.02.2011

В 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

Пояснение:

Любая часть окна, использующая ваш цвет прозрачности, будет полностью прозрачной. Вы можете просматривать любые значки или программы на рабочем столе, расположенные за окном игры, и взаимодействовать с ними.

Чтобы удалить границу окна, вы можете установить режим отображения Pygame на NOFRAME.

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

См. также:

person Stevoisiak    schedule 14.08.2018
comment
большое спасибо. можете ли вы предоставить некоторые ресурсы о методе, который вы использовали в этом примере, пожалуйста? ‹pdf/сайт/reddit/etc› - person N.S; 10.03.2019
comment
@N.S Мои ресурсы связаны в разделе См. также. - person Stevoisiak; 10.03.2019
comment
Это было очень полезно, большое спасибо, +1, кстати, есть ли способ сделать это или что-то подобное в Linux? - person Jam xP; 28.05.2019
comment
@whaleshark Я не знаю. Я не знаком с десктопным API Linux. - person Stevoisiak; 10.08.2020