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 ---