Gtk.Entry в Gtk.TreeView (CellRenderer)

Я хочу упаковать Gtk.Entry (с подключенным Gtk.EntryCompletion) в ячейку в Gtk.TreeView. Кто-нибудь знает, как это можно сделать? (Мне просто нужно завершение записи для текстовой записи в табличном представлении.)

Возможно, мне нужно создать подкласс Gtk.CellRenderer или Gtk.CellRendererText и переопределить метод start_editing (или аналогичный)? Я могу найти примеры создания подклассов Gtk.CellRenderer, но без изменения редактируемого поведения. Я также не могу найти исходный код для класса Gtk.CellRendererText.

Я использую Goobject Introspection (т.е. from gi.repository import Gio, Gtk, GLib, Gdk).


person simon    schedule 07.12.2012    source источник


Ответы (2)


Ладно, наконец-то я понял, как это сделать.

class CellRendererAutoComplete(Gtk.CellRendererText):

    """ Text entry cell which accepts a Gtk.EntryCompletion object """

    __gtype_name__ = 'CellRendererAutoComplete'

    def __init__(self, completion):
        self.completion = completion
        Gtk.CellRendererText.__init__(self)

    def do_start_editing(
               self, event, treeview, path, background_area, cell_area, flags):
        if not self.get_property('editable'):
            return
        entry = Gtk.Entry()
        entry.set_completion(self.completion)
        entry.connect('editing-done', self.editing_done, path)
        entry.show()
        entry.grab_focus()
        return entry

    def editing_done(self, entry, path):
        self.emit('edited', path, entry.get_text())

Вдохновение взято из часто задаваемых вопросов по PyGTK и адаптировано к pygobject .

person simon    schedule 07.12.2012
comment
Вы или любой другой человек, пришедший сюда, может захотеть ознакомиться с моим полным (читай, сложным) ответом здесь, для которого не требуется создание подклассов. - person theGtknerd; 22.07.2019

Вам не нужно создавать подклассы, GTK+ редко требует этого. Конечно, это может быть более практично в Python (чем в C), если это так, все должно быть в порядке.

На этой странице показано, как включить редактирование, установив свойство editable до TRUE.

Вы можете использовать gtk_tree_view_set_cursor() для перемещения курсора в ячейку, а также для запуска программного редактирования.

person unwind    schedule 07.12.2012
comment
спасибо, но я все это знаю, и это вообще не касается моего вопроса. мне нужно перехватить или переопределить событие on_edit, чтобы я мог изменить поведение, чтобы подключить Gtk.Entry к завершению или заменить его своим собственным, поддерживающим завершение. - person simon; 07.12.2012
comment
сегодня утром я нашел то, что искал (см. мой ответ). думаю, помог ночной сон, но +1 вам за то, что вы опубликовали что-то, что заставило меня снова начать думать об этом этим утром :) спасибо! - person simon; 07.12.2012
comment
я не думаю, что вы могли бы помочь с моей другой проблемой, не так ли? - person simon; 07.12.2012