finestre completamente trasparenti in Pygame?
Domanda
E 'possibile ottenere una finestra completamente trasparente in Pygame (vedere il desktop attraverso di esso)? Ho trovato come creare una finestra senza una cornice, ma non sembra essere un modo ovvio per renderla trasparente.
Sarei disposto a legare in tecnologia / quadri specifici del sistema fino a quando ci sono soluzioni per Windows e Mac OS X, ma non sono sicuro di quale direzione di essere alla ricerca.
L'unico argomento sono stato in grado di trovare consiglia di utilizzare wxPython , che isn' t qualcosa che posso fare per questo particolare progetto (deve essere Pygame).
Soluzione
PyGame utilizza SDL, che non supporta finestre trasparenti. Anche se, almeno su Linux rendendolo trasparente viene fatto dal gestore di finestre, non l'applicazione.
Altri suggerimenti
In Windows, è possibile creare un colore di sfondo solido quindi impostare il colore di trasparenza della finestra con la funzione API Win32 SetLayeredWindowAttributes()
. (Chiamato con pywin32 )
Codice:
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()
Risultato:
Spiegazione:
Ogni parte della finestra usando il vostro colore di trasparenza sarà completamente trasparente. È possibile visualizzare e interagire con le icone del desktop o programmi che si trovano dietro la finestra di gioco.
Per rimuovere il bordo della finestra, è possibile impostare la modalità di visualizzazione del Pygame per NOFRAME
.
screen = pygame.display.set_mode((800, 600), pygame.NOFRAME)
Vedere anche:
- Stack Overflow: fare una finestra trasparente utilizzando Win32 ?
- Stack Overflow: trasparente
- Microsoft: strati di Windows
- Microsoft: SetLayeredWindowAttributes funzione