Поиск…


Простое окно GTK

Простое представление окна легко с GTK и Python. Пример ниже основан на уроке Python GTK3 Tutorial , который вы должны прочитать, если вы новичок в программировании GUI или 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()

Что (в Windows 10) приведет к:

Результат приведенного выше примера

Простое привязка к событию key-press виджетов

Самый простой способ получить обработчик события, вызванный нажатием клавиши, - это связать обработчик с сигналом key-press-event . В этом примере мы регистрируем событие для всего окна, но вы также можете зарегистрироваться для отдельных виджетов.

Самой важной частью является подключение обработчика к событию:

self.connect("key-press-event",self.on_key_press_event)

В обработчике события виджет и событие нажатия клавиши передаются как параметры. Модификаторы нажатия клавиш, такие как клавиша Ctrl , доступны в event.state а нажатая клавиша - event.keyval .

Значения для ключей-модификаторов находятся в Gdk.ModiferType и включают CONTROL_MASK , SHIFT_MASK и некоторые другие.

Значения ключей находятся в Gdk с префиксами KEY_ , например, ключ h - Gdk.KEY_h ). Они могут быть преобразованы в строку с использованием 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()

Более продвинутое поведение для ярлыков в прикладной среде может быть достигнуто с помощью группы ускорителей ( Gtk.AccelGroup ), но часто быстрый обработчик нажатия клавиш - это все, что вам нужно для захвата событий клавиатуры, которые вы хотите для определенного виджета.

Вставить видео в окно Gtk в Python3

Ниже приведен пример конвейера Gstreamer, встроенного в простое окно gtk. При запуске небольшое окно должно выглядеть следующим образом:

Пример при запуске

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()


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow