Необходимость дважды выбрать элемент в дереве, прежде чем можно будет активировать поле со списком

Я рисую графический интерфейс, используя GTK+ с PyGTK.

Я создал ComboBox в TreeView. Но проблема в том, что когда я впервые нажимаю на элемент, стрелка раскрывающегося списка нечувствительна (неактивна). Мне пришлось щелкнуть другой элемент, а затем снова вернуться к нему, чтобы стрелка раскрывающегося списка снова стала чувствительной.

Является ли это стандартом для ComboBox в TreeView? Если у вас есть исправление на любом другом языке, я также могу его принять.

Пример можно найти здесь. Он столкнулся с некоторыми другими проблемами, но его код также демонстрирует проблему.


person elwc    schedule 20.12.2012    source источник


Ответы (1)


Проблема с кодом, на который вы ссылаетесь выше, заключается в том, что ComboBox на самом деле имеет только 1 элемент, когда вы начинаете редактирование, что делает функцию раскрывающегося списка бесполезной (и, следовательно, неактивной). Чтобы заставить его вести себя так, как я подозреваю, вы хотите, все, что вам нужно сделать, это использовать другой сигнал для выполнения self.populate_combo. Я добавил две строки после создания дерева, чтобы заставить его работать:

    treeview = gtk.TreeView(liststore_hardware)
    sel = treeview.get_selection()
    sel.connect("changed", self.populate_combo)

То есть я сделал измененный выбор, вызывающий заполнение комбо, что подразумевало, что в них было более одного элемента, когда управление было возвращено в основной цикл. И, следовательно, выпадающий список работал.

Я также закомментировал предыдущий сигнал editing-started, так как он ничего не добавляет к текущей структуре программы.

    window.connect("destroy", lambda w: gtk.main_quit())
    #self.cellrenderer_combo.connect("editing-started", self.populate_combo)
    self.cellrenderer_combo.connect("edited", self.combo_changed, liststore_hardware)

Изменить:

Если подумать, модель представляет собой None после запуска __init__, а не 1-длины на строку, как я писал выше, что делает отсутствие выпадающих функций еще более разумным.

Комментарий:

Код, на который вы ссылаетесь, и мое изменение к нему рациональны только в том случае, если изменение строк (или редактирование) вызывает острую необходимость переписать файл ListStore. Я не совсем уверен, какой тип сценария потребует этого. Если, с другой стороны, содержимое TreeView и ComoBox' ListStore различается в результате действия поиска или фильтрации, выполненной в другом месте, то этот поиск, а не изменение строк, должен вызывать populate_combo.

Таким образом, альтернативное решение в рамках имеющегося кода, мое предложенное выше событие также можно закомментировать, а простое

    self.populate_combo()

добавить в качестве последней строки функции init.

Кроме того, если возникнет необходимость повторного заполнения комбинаций во время работы приложения, я бы предложил изменить текущую ListStore, а не создавать новую каждый раз, если изменения не будут значительными (в которых случае сделать новый, наверное, быстрее и проще всего).

person deinonychusaur    schedule 26.12.2012
comment
Благодарю вас! Полностью понял, что вы имели в виду. Поэтому вместо этого я должен использовать сигнал из дерева. - person elwc; 26.12.2012
comment
Рад, что это помогло, но ознакомьтесь с моим новым комментарием выше, так как он, вероятно, поможет в создании более качественного дизайна. - person deinonychusaur; 26.12.2012
comment
Понял! Дал мне больше информации о том, как использовать PyGTK. - person elwc; 26.12.2012