Python2/Pygobject/Gtk3/Glade3 проверить фокус TextView

Я разрабатываю приложение в стиле текстового редактора с использованием Python2.7 и Gtk3, и я не очень уверен, как настроить обработчик, чтобы проверить, находится ли основной TextView в данный момент в фокусе, поэтому я могу отключить элементы меню (например, Правка -> Копировать и т. д.) соответственно.

Чтобы создать текстовый редактор с вкладками, я использую Gtk.Notebook в качестве основного тела, и каждый раз, когда активируется File -> New, я создаю новое ScrolledWindow и TextView для создания новой вкладки в текстовом редакторе:

def on_imagemenuitemNew_activate(self, *args):
  editor = Gtk.ScrolledWindow()
  editor.add(Gtk.TextView())
  editor.set_shadow_type(Gtk.ShadowType.IN)
  editor.show_all()
  #The instance of Gtk.Notebook is passed to the handler as user data in args[0]
  args[0].append_page(editor, Gtk.Label('untitled'))

Это отлично работает, но если я попытаюсь использовать:

editor.connect('focus-in-event', self.on_editor_focus_in_event)

внутри блока он никогда не регистрируется моим обработчиком:

def on_editor_focus_in_event(self, *args):
  print 'Focused!'

Я подозреваю, что проблема может быть связана с тем, что каждый экземпляр editor кажется идентичным, но это действительно ставит меня в тупик. Простите за корявый код, я только вчера начал изучать GTK, а Pygobject/Gtk3 не очень хорошо документирован.


person Nick Hu    schedule 22.08.2012    source источник
comment
Может быть, это может помочь? mail.gnome.org/archives/gtk- app-devel-list/2012-февраль/   -  person Kristina Brooks    schedule 23.08.2012


Ответы (2)


В вашем коде editor это Gtk.ScrolledWindow. Я не думаю, что ScrolledWindows могут иметь фокус. Попробуйте подключиться к событию фокуса вашего TextView, убедившись, что вы включили правильную маску, как указала @TinaBrooks.

person ptomato    schedule 22.08.2012
comment
Это сделало трюк! Благодарю вас! С этим, похоже, работает и без маски. Мне просто нужно было сделать это: editor.get_child().connect('focus-in-event', self.on_editor_focus_in_event) - person Nick Hu; 23.08.2012

Я могу только предположить, но в документации сказано, что «для получения этого сигнала GdkWindow, связанный с виджетом, должен включить маску GDK_FOCUS_CHANGE_MASK».

Вы уверены, что он у вас включен?

person Kristina Brooks    schedule 22.08.2012
comment
В PyGObject этим конкретным перечислением является Gdk.EventMask.FOCUS_CHANGE_MASK. Кроме того, оно не работает даже с этим набором масок. - person Nick Hu; 23.08.2012