在Liststore中将项目动态添加到CellRendererCombo:Pygtk [英] Dynamically adding Items to CellRendererCombo in Liststore : Pygtk
问题描述
我正在尝试将商品动态添加到CellRendererCombo
.请参见下面的代码.当我单击'Samsung'
时,组合框中列出了相应的项目.现在的问题是,当我单击'LG'
时,列出了与三星"相对应的项目.简而言之,组合框显示的是先前选择的键的项目,而不是当前键的项目.
I am trying add items to CellRendererCombo
dynamically. See the code below. When I click on 'Samsung'
the corresponding items is listed in the combo box. Now the problem is, when I click 'LG'
, the items corresponds to 'Samsung' is listed. In short, the combo box is showing items for the previously selected key, not for the current key.
我该如何解决这个问题?
How can I solve this issue?
#!/usr/bin/env python
import gtk,os
class CellRendererCombo:
def __init__(self):
window = gtk.Window()
window.set_default_size(200, 200)
liststore_hardware = gtk.ListStore(str, str)
liststore_hardware.append(["Television", "Samsung"])
liststore_hardware.append(["Mobile Phone", "LG"])
liststore_hardware.append(["DVD Player", "Sony"])
treeview = gtk.TreeView(liststore_hardware)
column_text = gtk.TreeViewColumn("Text")
column_combo = gtk.TreeViewColumn("Combo")
treeview.append_column(column_text)
treeview.append_column(column_combo)
cellrenderer_text = gtk.CellRendererText()
column_text.pack_start(cellrenderer_text, False)
column_text.add_attribute(cellrenderer_text, "text", 0)
self.cellrenderer_combo = gtk.CellRendererCombo()
self.cellrenderer_combo.set_property("editable", True)
self.cellrenderer_combo.set_property("text-column", 0)
column_combo.pack_start(self.cellrenderer_combo, False)
column_combo.add_attribute(self.cellrenderer_combo, "text", 1)
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)
window.add(treeview)
window.show_all()
def combo_changed(self, widget, path, text, model):
model[path][1] = text
def populate_combo(self,*args):
liststore_manufacturers = gtk.ListStore(str)
manufacturers={}
manufacturers['Samsung'] = ["Samsung", "Item1","Item2", "Item3", "Item4"]
manufacturers['LG'] = ["LG", "Item5", "Item6", "Item7", "Item8", "Item9",'Item10']
manufacturers['Sony'] = ["Sony", "Item11", "Item12", "Item13", "Item14", "Item15",'Item16']
catgry=self.cellrenderer_combo.get_property ("text") # read the content of combobox
for item in manufacturers[catgry]:
liststore_manufacturers.append([item])
self.cellrenderer_combo.set_property("model", liststore_manufacturers)
#
CellRendererCombo()
gtk.main()
推荐答案
问题已解决.问题是因为在发出GtkCellEditable::editing-started
信号之前已设置弹出式组合框上的模型.并且为combobox
中的下一个弹出窗口设置了editing-started
处理程序.
Problem solved. The issue was because model on combobox that pops-up is set before GtkCellEditable::editing-started
signal is emitted. And the editing-started
handler was set for the next pop-up in combobox
.
因此,我创建了另一种方法来捕获列表存储已更改"的信号,并编写了用于在该方法中动态填充cellrendercombobox
的列表存储的代码.
So I create another method to capture liststore "changed" signal, and wrote the code to dynamically populate the liststore for cellrendercombobox
in that method.
treeviewmodel = self.tree_view.get_model()
tree_selection = self.tree_view.get_selection()
tree_selection.connect("changed", self.onSelectionChanged)
......
def onSelectionChanged(self,tree_selection) :
value=None
(model, pathlist) = tree_selection.get_selected_rows()
for path in pathlist :
tree_iter = model.get_iter(path)
value = model.get_value(tree_iter,0)
print value
if value:
<code to populate the liststore>
这篇关于在Liststore中将项目动态添加到CellRendererCombo:Pygtk的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!