Я работаю над создаванием приложения для 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'
Скорее всего, Вы после руководства 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? Давайте сделаем это шаг за шагом:
accel_group
параметр быть неявными, поскольку это - первый параметр и ссылка на объект, который мы пытаемся изменить. accel_key
) более хитер: это - целое число, и документация просто говорит нам значение ключа акселератора , который в основном означает фигура самостоятельно, как найти значение сочетания клавиш . К счастью, некоторый быстрый поиск показывает функцию gdk_keyval_from_name
, который, кажется, делает то, что мы хотим. (И вызов Gdk.keyval_from_name('O')
на самом деле возвраты правильный результат.) accel_mods
: Путем нажатия на его тип ( GdkModifierType
) мы получаем хороший список всех возможных типов модификатора. Поскольку Вы хотели использовать <Control>
модификатор, который мы можем просто использовать Gdk.ModifierType.CONTROL_MASK
и углубить. accel_flags
также имеет активируемый по щелчку тип ( GtkAccelFlags
), и открытие его описания показывает, что ни один из этих параметров не необходим так, мы можем безопасно использовать 0
для этого параметра. 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!