gtk3
GTK + 3 z Pythonem
Szukaj…
Proste okno GTK
Po prostu prezentacja okna jest łatwa dzięki GTK i Pythonowi. Poniższy przykład oparty jest na samouczku Python GTK3 , który powinieneś przeczytać, jeśli jesteś początkującym w programowaniu GUI lub GTK.
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
# Set up the Gtk window
win = Gtk.Window()
# Tell Gtk what to do when the window is closed (in this case quit the main loop)
win.connect("delete-event", Gtk.main_quit)
# Create a label saying Hello World!
label = Gtk.Label(label="Hello World!")
# Add the label to the window
win.add(label)
# Tell Gtk to show all widgets inside the window
win.show_all()
# Start the Gtk main loop, which returns when Gtk.main_quit is called
Gtk.main()
Co spowoduje (w systemie Windows 10):
Proste powiązanie ze zdarzeniem naciśnięcia klawisza widżetu
Najprostszym sposobem na wywołanie procedury obsługi zdarzenia po naciśnięciu klawisza jest połączenie procedury obsługi z sygnałem key-press-event
. W tym przykładzie rejestrujemy się na wydarzenie dla całego okna, ale możesz także zarejestrować się dla poszczególnych widżetów.
Najważniejszą częścią jest połączenie procedury obsługi ze zdarzeniem:
self.connect("key-press-event",self.on_key_press_event)
W module obsługi zdarzeń widżet i zdarzenie naciśnięcia klawisza są przekazywane jako parametry. Modyfikatory naciśnięcia klawisza, takie jak klawisz Ctrl , są dostępne w event.state
a naciśnięty klawisz to event.keyval
.
Wartości kluczy modyfikujących znajdują się w Gdk.ModiferType
i obejmują CONTROL_MASK
, SHIFT_MASK
i kilka innych.
Wartości kluczy znajdują się w Gdk
z prefiksami KEY_
, na przykład klucz h to Gdk.KEY_h
). Można je przekonwertować na ciąg za pomocą Gdk.keyval_name()
.
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
class MyWindow(Gtk.Window):
key = Gdk.KEY_h
def __init__(self):
# init the base class (Gtk.Window)
super().__init__()
# state affected by shortcuts
self.shortcut_hits = 0
# Tell Gtk what to do when the window is closed (in this case quit the main loop)
self.connect("delete-event", Gtk.main_quit)
# connect the key-press event - this will call the keypress
# handler when any key is pressed
self.connect("key-press-event",self.on_key_press_event)
# Window content goes in a vertical box
box = Gtk.VBox()
# mapping between Gdk.KEY_h and a string
keyname = Gdk.keyval_name(self.key)
# a helpful label
instruct = Gtk.Label(label="Press Ctrl+%s" % keyname)
box.add(instruct)
# the label that will respond to the event
self.label = Gtk.Label(label="")
self.update_label_text()
# Add the label to the window
box.add(self.label)
self.add(box)
def on_key_press_event(self, widget, event):
print("Key press on widget: ", widget)
print(" Modifiers: ", event.state)
print(" Key val, name: ", event.keyval, Gdk.keyval_name(event.keyval))
# check the event modifiers (can also use SHIFTMASK, etc)
ctrl = (event.state & Gdk.ModifierType.CONTROL_MASK)
# see if we recognise a keypress
if ctrl and event.keyval == Gdk.KEY_h:
self.shortcut_hits += 1
self.update_label_text()
def update_label_text(self):
# Update the label based on the state of the hit variable
self.label.set_text("Shortcut pressed %d times" % self.shortcut_hits)
if __name__ == "__main__":
win = MyWindow()
win.show_all()
# Start the Gtk main loop
Gtk.main()
Bardziej zaawansowane zachowanie skrótów w całej aplikacji można uzyskać za pomocą grupy akceleratorów ( Gtk.AccelGroup
), ale często wystarczy szybka obsługa naciśnięć klawiszy, aby uchwycić zdarzenia klawiatury potrzebne do określonego widżetu.
Osadź wideo w oknie Gtk w Python3
Poniżej znajduje się przykład potoku Gstreamer osadzonego w prostym oknie GTK. Po uruchomieniu małe okno powinno wyglądać tak:
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('Gst', '1.0')
from gi.repository import Gtk, Gst
Gst.init(None)
Gst.init_check(None)
class GstWidget(Gtk.Box):
def __init__(self, pipeline):
super().__init__()
# Only setup the widget after the window is shown.
self.connect('realize', self._on_realize)
# Parse a gstreamer pipeline and create it.
self._bin = Gst.parse_bin_from_description(pipeline, True)
def _on_realize(self, widget):
pipeline = Gst.Pipeline()
factory = pipeline.get_factory()
gtksink = factory.make('gtksink')
pipeline.add(self._bin)
pipeline.add(gtksink)
# Link the pipeline to the sink that will display the video.
self._bin.link(gtksink)
self.pack_start(gtksink.props.widget, True, True, 0)
gtksink.props.widget.show()
# Start the video
pipeline.set_state(Gst.State.PLAYING)
window = Gtk.ApplicationWindow()
# Create a gstreamer pipeline with no sink.
# A sink will be created inside the GstWidget.
widget = GstWidget('videotestsrc')
widget.set_size_request(200, 200)
window.add(widget)
window.show_all()
def on_destroy(win):
Gtk.main_quit()
window.connect('destroy', on_destroy)
Gtk.main()