LINUX.ORG.RU

[PyGTK][gtk.AccelGroup] Помогите разобраться с кейбиндингами

 


0

1

Приветствую.

Захотелось мне закрывать окно по нажатию Escape. Посмотрел несколько примеров. Создал окно, gtk.AccelGroup, акселератор вызывающий сигнал «delete-event» по нажатию Escape с помощью add_accelerator и присобачил обработчик этого сигнала. Если опустить все второстепенное, получилось следующее:

window = gtk.Window()

accel_group = gtk.AccelGroup()
window.add_accel_group(accel_group)

(key, mod) = gtk.accelerator_parse("Escape")
window.add_accelerator("delete-event", accel_group, key, mod, gtk.ACCEL_LOCKED)
window.connect("delete-event", on_window_destroy)
При запуске пишет следующее:
nkt@arnor pyexec % ./pyexec
/home/nkt/development/pyexec/pyexec.py:85: GtkWarning: gtkwidget.c:4461: widget `GtkWindow' has no activatable signal "delete-event" without arguments
  self.window.add_accelerator("delete-event", accel_group, key, mod, gtk.ACCEL_LOCKED)
и по Escape понятное дело никто не выходит.

Таки что я делаю не так?

★★★★★

Кажется я понял в чем проблема. Оказывается с помощью add_accelerator() можно вызывать не абы-какой сигнал, а только имеющий флаг gobject.SIGNAL_ACTION.

fat_angel ★★★★★
() автор топика

Тем не менее вопрос о выходе по Escape, а также выполнении других вещей к которым не достучаться с помощью add_accelerator() остается в силе.

Как это правильнее сделать? Добавить акселератор в AccelGroup с помощью метода connect_group()? Возиться с обработкой сигнала key-press-event? Может еще что-нибудь имеется?

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от baverman

Мне он тоже понравился, вчера попробовал. Если более красивых предложений не последует наверное на нем и остановлюсь.

Единственное что не очень устроило — это необходимость писать дополнительные обработчики из-за разницы в списке передаваемых параметров. Хотелось бы воспользоваться уже написанными обработчиками сигналов. Можно конечно в качестве списка параметров использовать универсальные аргументы (*args, **kwargs), но этот вариант мне тоже не особо нравится.

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от fat_angel

Можно конечно в качестве списка параметров использовать универсальные аргументы (*args, **kwargs), но этот вариант мне тоже не особо нравится.

Можно еще в лямбду оборачивать.

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.