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 все работает отлично.


person boywithaxe    schedule 25.06.2012    source источник


Ответы (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(...) происходит совпадение между сигналом и методом. Это объясняет синтаксическую ошибку в вашем коде.

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

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

or

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

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

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

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

person gpoo    schedule 25.06.2012

Я бы предпочел использовать обратный вызов сигнала 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 ---
person barti_ddu    schedule 25.06.2012