PyGTK - Сигнал вставки при курсоре GtkEntry не работает

Я пытаюсь использовать сигнал GtkEntry.insert-at-cursor в моем коде, но, похоже, он не работает.

    def on_servername_activate(self, widget):
       output = StringIO.StringIO()         
       servername = widget.get_text()
       self.output.write("USHARE_NAME="+servername+'\n')

Это часть моего кода, где я хотел бы использовать insert-at-cursor, Я почти уверен, что это ошибка, которую я делаю. Я заменил on_servername_activate с on_servername_insertatcursor (так как on_servername_insert-at-cursor выдает синтаксическую ошибку на первом дефисе), и ничего не происходит, когда текст вставляется в поле. Ничто не вставляется в outputОднако все отлично работает с activate сигнал.

2 ответа

Решение

Кажется, есть концептуальная ошибка между сигналами и методами.

С одной стороны, сигналы запускаются, когда происходит событие, эти сигналы могут быть именами в виде строк, таких как "insert-at-cursor" или "insert_at_cursor". С другой стороны, вам нужно соединить эти сигналы (в виджете) с вашими функциями / методами. Функции / методы могут иметь любое произвольное имя, для облегчения их чтения мы стараемся называть их как можно ближе к сигналам, но это не обязательно.

В вашем случае вы можете захотеть иметь что-то вроде:

class Foo:
  ...
  def create_widgets(self):
      entry.gtkEntry()
      entry.connect('insert-at-cursor', self.entry_insert_at_cursor)

  def entry_insert_at_cursor(self, *args):
      # some code

Как видите, в entry.connect (...) происходит совпадение сигнала и метода. Это объясняет синтаксическую ошибку в вашем коде.

Другое заблуждение, похоже, заключается в использовании сигнала вставки-при-курсоре. Для этого сигнала вы должны привязать запись к клавише, которая не выглядит так, как вы ищете. В зависимости от версии GTK, на которую вы ориентируетесь, вы можете использовать:

      entry.connect('changed', self.entry_changed)

или же

      entry.connect('insert-text', self.entry_insert_text)

В последнем ваш метод получит как измененный текст, так и позицию. Точно так же вы можете иметь дело непосредственно с буфером, связанным с записью:

      entry.connect('inserted-text', self.buffer_entry_inserted_text)

Где метод получит дополнительно количество вставленных байтов.

Я бы предпочел использовать обратный вызов вставленного текста объекта gtk.EntryBuffer, как показано ниже:

def on_insert_cb (buf, pos, chars, nch):
    print buf.get_text()

# --- skip ---

entry = gtk.Entry()
entry.get_buffer().connect("inserted-text", on_insert_cb)

# --- skip ---
Другие вопросы по тегам