gtk:在CellRenderCombo“更改”标志上修改TreeView模型时出现问题

2024-10-03 19:28:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个树视图,在给定的列中有一个cellRenderCombo。我使用以下代码设置列:

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)

treeViewTreeViewtreeViewModel是它的模型,comboModel是只包含两个字符串的组合项的模型。在

如果我运行代码,那么组合框将按预期工作,但第一次选择条目时会出现以下错误:

^{pr2}$

第二次我得到:

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 docs for pygtk中注意到了这一点:

Note that as soon as you change the model displayed in the tree view, the tree view will immediately cease the editing operating. This means that you most probably want to refrain from changing the model until the combo cell renderer emits the edited or editing_canceled signal.

不过,它没有提到代码会崩溃。在任何情况下,我希望在单击组合框中的条目后,编辑停止,而不必按ENTER键或单击其他位置。我怎么才能做到呢?在


Tags: thepath代码textgtkmodelclcell
2条回答

我不确定,但我想得到答案最快的方法是搜索pygtk邮件列表,如果你找不到类似的帖子,试着把它发到邮件列表中。在

pygtk mailing list

选择一个项后立即结束对CellRendererCombo的编辑是一个两阶段的过程。在

在第一个阶段,必须捕获组合体本身,因为以后无法访问它。要捕获组合,请连接到editing-startedCellRenderer信号。您可以在Glade中定义连接,也可以在代码中手动创建。在

在第二阶段,在cellRenderCombo的changed信号处理程序中发出focus-out-event。在

以下是修改后的原始代码以演示:

comboEditable = None

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"
    e = gtk.gdk.Event(gtk.gdk.FOCUS_CHANGE)
    e.window = treeView.window
    e.send_event = True
    e.in_ = False
    comboEditable.emit('focus-out-event', e)
def started(cell, editable, path):
    # Or to make life more predictable, use a class and set self.comboEditable
    global comboEditable
    comboEditable = editable
crc.connect('changed', changed)
crc.connect('editing-started', started)

treeView.append_column(cl)

注意,在GTK+的较新版本中,通常不会修改changed信号处理程序中的TreeModel。您应该使用edited信号处理程序。在

以下是最终版本:

^{pr2}$

相关问题 更多 >