Сочетания клавиш Python GTK3

Я работаю над создаванием приложения для Ubuntu с помощью Python3 и Gtk3.

Я пытаюсь добавить сочетания клавиш к программе, но к сожалению я продолжаю сталкиваться с проблемами.

Это - мой банкомат кода:

#! /bin/python

from gi.repository import Gtk, Gdk

class DeSedit(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="DeSedit")

        self.set_default_size(550, 350)

        # FileChooserDialog - Open File
        dialog = Gtk.FileChooserDialog("Select file to be opened", self,
            Gtk.FileChooserAction.OPEN,
            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
            Gtk.STOCK_OK, Gtk.ResponseType.OK))
        # keyboard shortcuts
        accel = Gtk.AccelGroup()
        self.add_accel_group(accel)
        self.add_accelerator(dialog, "<Control>o", signal="open")

        def add_accelerator(self, widget, accelerator, signal="activate"):
            """ adds <Control>o as accelerator for open-file dialog """
            if accelerator is not None:
                key, mod = Gtk.accelerator_parse(accelerator)
            widget.add_accelelator(signal, accel, key, mod, Gtk.AccelFlags.VISIBLE)
            print("works")

        # grid to organize widgets
        self.box = Gtk.Box()
        self.add(self.box)
        # text view
        self.textview = Gtk.TextView()
        self.textview.set_wrap_mode(True)
        # scroll bar
        scrollwindow = Gtk.ScrolledWindow()
        scrollwindow.add(self.textview)

        self.box.pack_start(scrollwindow, True, True, 0)


window = DeSedit()  # create DeSedit object
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()

Я получаю эту ошибку:

File "file.py", line 41, in 
    window = DeSedit()  # create DeSedit object
  File "file.py", line 19, in __init__
    self.add_accelerator(self.dialog, "o", signal="open")
TypeError: add_accelerator() got an unexpected keyword argument 'signal'
0
задан 1 August 2015 в 22:44

1 ответ

Скорее всего, Вы после руководства PyGtk 2 при попытке реализовать это: Согласно документации GTK 3 нет никакой функции, названной gtk_window_add_accelerator, но существует функция, названная gtk_accel_group_connect, который похож на ее попытку сделать задание. При работе с документацией GTK это - обычно 80%-е инстинктивное чувство и 20%, проверяющих документы замеченному если право. Не ожидайте необычные учебные руководства или руководства (Вы будете разочарованы большую часть времени), †¦

Так или иначе: Смотря gtk_accel_group_connect документация, мы видим эти параметры: accel_group, accel_key, accel_mods, accel_flags и closure.

Поэтому, как вызвать эту функцию из Python? Давайте сделаем это шаг за шагом:

  1. , Так как мы находимся в Python (объектно-ориентированный язык), мы можем ожидать accel_group параметр быть неявными, поскольку это - первый параметр и ссылка на объект, который мы пытаемся изменить.
  2. следующий параметр (accel_key) более хитер: это - целое число, и документация просто говорит нам значение ключа акселератора , который в основном означает фигура самостоятельно, как найти значение сочетания клавиш . К счастью, некоторый быстрый поиск показывает функцию gdk_keyval_from_name , который, кажется, делает то, что мы хотим. (И вызов Gdk.keyval_from_name('O') на самом деле возвраты правильный результат.)
  3. Следующий параметр accel_mods: Путем нажатия на его тип ( GdkModifierType ) мы получаем хороший список всех возможных типов модификатора. Поскольку Вы хотели использовать <Control> модификатор, который мы можем просто использовать Gdk.ModifierType.CONTROL_MASK и углубить.
  4. accel_flags также имеет активируемый по щелчку тип ( GtkAccelFlags ), и открытие его описания показывает, что ни один из этих параметров не необходим так, мы можем безопасно использовать 0 для этого параметра.
  5. Наконец мы в последнем параметре (closure): С тех пор closure просто необычное слово для обратного вызова (что-то, что нужно назвать, когда что-то происходит), мы можем просто использовать то, что закрытия краткого обзора привязки GTK Python для нас и и передают некоторую вызываемую функцию сюда, которая вызвана каждый раз, когда <Control>O был нажат.

В контексте код теперь похож на это (проверенный для работы):

#!/usr/bin/python3

from gi.repository import Gtk, Gdk

class DeSedit(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="DeSedit")

        self.set_default_size(550, 350)

        # FileChooserDialog - Open File
        dialog = Gtk.FileChooserDialog("Select file to be opened", self,
            Gtk.FileChooserAction.OPEN,
            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
            Gtk.STOCK_OK, Gtk.ResponseType.OK))
        # keyboard shortcuts
        accel = Gtk.AccelGroup()
        accel.connect(Gdk.keyval_from_name('O'), Gdk.ModifierType.CONTROL_MASK, 0, self.on_accel_pressed)
        self.add_accel_group(accel)

        # grid to organize widgets
        self.box = Gtk.Box()
        self.add(self.box)
        # text view
        self.textview = Gtk.TextView()
        self.textview.set_wrap_mode(True)
        # scroll bar
        scrollwindow = Gtk.ScrolledWindow()
        scrollwindow.add(self.textview)

        self.box.pack_start(scrollwindow, True, True, 0)

    def on_accel_pressed(self, *args):
        dialog = Gtk.FileChooserDialog("Select file to be opened", self,
            Gtk.FileChooserAction.OPEN,
            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
            Gtk.STOCK_OK, Gtk.ResponseType.OK))
        dialog.show()


window = DeSedit()  # create DeSedit object
window.connect("delete-event", Gtk.main_quit)

Hope это запустило Вас с GTK+3!

3
ответ дан 1 October 2019 в 05:39

Другие вопросы по тегам:

Похожие вопросы: