LINUX.ORG.RU

обработка клавиш не даёт писать текст в gtk

 ,


1

3

Есть программа, в ней нужно вписывать текст. Есть обработчик, такая функция.

gboolean main_window ( GtkWidget *widget, GdkEvent *event, gpointer data )
{
  switch ( event->type ) {
    case GDK_KEY_PRESS:
      switch ( event->key.keyval ){
        case GDK_Q:
        case GDK_q:
          if ( event->key.state & GDK_CONTROL_MASK )
            gtk_main_quit ();
          break;
        case GDK_W:
        case GDK_w:
          if ( event->key.state & GDK_CONTROL_MASK )
            gtk_widget_destroy ( widget );
          break;
      }
      break;
  }
}
Если эта функция отлавливает нажатия клавиш, то писать ничего не могу.

Естественно. Сделай ввод текста из этой своей функции.

aiqu6Ait ★★★★
()

Сдается мне, ты делаешь это не правильно.

Во-первых, в общем случае обрабатывать можно не глобальный keypress, а сигналы которые излучает виджет с текстом.

Во-вторых, для твоей задачи в gtk есть акселераторы. Для примера код на просветленном яп:

from gi.repository import Gtk

class Main():
    def __init__(self):
        self.win = Gtk.Window()
        self.entry = Gtk.Entry()

        self.accelerators = Gtk.AccelGroup()
        self.win.add_accel_group(self.accelerators)

        key, mod = Gtk.accelerator_parse("<Control>q")
        self.accelerators.connect(key, mod, Gtk.AccelFlags.VISIBLE, Gtk.main_quit)
        key, mod = Gtk.accelerator_parse("<Control>w")
        self.accelerators.connect(key, mod, Gtk.AccelFlags.VISIBLE, self.on_widget_destroy)

        self.win.add(self.entry)
        self.win.connect("delete-event", Gtk.main_quit)
        self.win.show_all()

    def on_widget_destroy(self, *args):
        self.entry.destroy()

if __name__ == "__main__":
    Main()
    Gtk.main()

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

ага, работает. но (цитата) «писать ничего не могу»

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

Когда обработчик сигнала возвращает TRUE, считается, что обрабатывать сигнал больше не надо. Если же возвращается FALSE, то сигнал дальше обрабатывается остальными обработчиками. Поэтому в конце функции надо добавить:

return FALSE;
neon1ks ★★
()
Последнее исправление: neon1ks (всего исправлений: 2)
Ответ на: комментарий от u0atgKIRznY5

Возможно сам догадался, когда изучал GTK

Но об этом написано в документации: https://developer.gnome.org/gtk3/3.18/GtkWidget.html#GtkWidget-key-press-event

Старый перевод (большая часть api не изменилась): https://www.opennet.ru/docs/RUS/gtk-reference/GtkWidget.html

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

P.S. Выше я писал про сигнал «key-press-event» и подобные ему сигналы. Для других сигналов, могут быть другие прототипы обработчиков, и соответственно другие возвращаемые значения.

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