py-vpet/experiments/window_gtk.py
2024-12-11 18:31:41 +01:00

58 lines
1.8 KiB
Python

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GdkPixbuf, cairo
class VPetWindow(Gtk.Window):
def __init__(self):
super().__init__()
# Fensterkonfiguration
self.set_title("vPet")
self.set_default_size(48, 48)
self.set_app_paintable(True)
self.set_decorated(False)
self.set_keep_above(True)
self.set_accept_focus(False)
# Entferne den Fensterschatten und wende RGBA-Visual an
screen = self.get_screen()
visual = screen.get_rgba_visual()
if visual:
self.set_visual(visual)
# Mausereignisse ignorieren
self.connect("screen-changed", self.on_screen_changed)
self.set_app_paintable(True)
self.on_screen_changed(None)
# Lade und zeige das Sprite (virtuelles Haustier)
self.image = Gtk.Image()
pixbuf = GdkPixbuf.Pixbuf.new_from_file("vpet_sprite.png") # Ersetze mit deinem Sprite
self.image.set_from_pixbuf(pixbuf)
self.add(self.image)
self.show_all()
def on_screen_changed(self, screen):
gdk_window = self.get_window()
if gdk_window:
# Eingabeform auf das Sprite beschränken
region = Gdk.cairo_region_create_from_surface(self.get_mask())
gdk_window.input_shape_combine_region(region)
def get_mask(self):
# Maske für die Eingabe basierend auf der Sprite-Form erstellen
pixbuf = self.image.get_pixbuf()
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, pixbuf.get_width(), pixbuf.get_height())
cr = cairo.Context(surface)
Gdk.cairo_set_source_pixbuf(cr, pixbuf, 0, 0)
cr.paint()
return surface
if __name__ == "__main__":
win = VPetWindow()
win.connect("destroy", Gtk.main_quit)
Gtk.main()