У меня есть вид дерева с CellRendererCombo в данном столбце. Я использую следующий код для настройки столбца:
crc = gtk.CellRendererCombo()
crc.set_property('model', comboModel)
crc.set_property('text-column', 0)
crc.set_property('editable', True)
crc.set_property('has_entry', False)
cl = gtk.TreeViewColumn(ctitle, crc, text=i)
def changed(cell, path, newiter):
treeViewModel[path][0] = "HAH"
crc.connect("changed", changed)
treeView.append_column(cl)
treeView
- это TreeView
, treeViewModel
- его модель, а comboModel
- модель для комбинированной записи, содержащей всего две строки.
Если я запускаю код, то комбо работает должным образом, за исключением того, что при первом выборе записи появляются следующие ошибки:
c:\python25\lib\site-packages\twisted\internet\gtk2reactor.py:255: Warning: inva
lid unclassed pointer in cast to `GObject'
gtk.main()
c:\python25\lib\site-packages\twisted\internet\gtk2reactor.py:255: Warning: g_ob
ject_notify: assertion `G_IS_OBJECT (object)' failed
gtk.main()
Во второй раз я получаю:
c:\python25\lib\site-packages\twisted\internet\gtk2reactor.py:255: Warning: inva
lid uninstantiatable type `<invalid>' in cast to `GObject'
gtk.main()
и в третий раз программа вылетает. Если я изменю соединительную линию на:
crc.connect("edited", changed)
... тогда код работает нормально. Однако значение изменяется только после щелчка вне поля со списком, и я бы предпочел, чтобы оно менялось при каждом выборе объекта. Как я могу сделать последнее?
РЕДАКТИРОВАТЬ: Я только что заметил это в API документы для pygtk :
Обратите внимание, что как только вы измените модель, отображаемую в древовидном представлении, древовидное представление немедленно прекратит операцию редактирования. Это означает, что вы, скорее всего, захотите воздержаться от изменения модели до тех пор, пока средство визуализации комбинированной ячейки не выдаст отредактированный сигнал или edit_canceled.
Это не упоминает, что код потерпит крах, хотя. В любом случае мне бы хотелось, чтобы после нажатия на запись в комбинированном списке редактирование прекращалось без необходимости нажимать клавишу ВВОД или щелкать где-либо еще. Как мне это сделать?