Динамично добавяне на елементи към CellRendererCombo в Liststore: Pygtk

Опитвам се да добавя елементи към CellRendererCombo динамично. Вижте кода по-долу. Когато щракна върху 'Samsung', съответните елементи се показват в разгъващия се списък. Сега проблемът е, че когато щракна върху 'LG', елементите, съответстващи на „Samsung“, са изброени. Накратко, комбинираното поле показва елементи за предварително избрания ключ, а не за текущия ключ.

Как мога да разреша този проблем?

#!/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()

person ani    schedule 23.08.2012    source източник
comment
Мисля, че проблемът е в сигнала за стартиране на редактиране.   -  person ani    schedule 23.08.2012


Отговори (1)


Проблема решен. Проблемът беше, защото моделът на изскачащия списък е зададен преди да бъде излъчен сигнал GtkCellEditable::editing-started. И манипулаторът editing-started беше зададен за следващия изскачащ прозорец в combobox.

Така че създадох друг метод за улавяне на „променения“ сигнал на liststore и написах кода за динамично попълване на liststore за cellrendercombobox в този метод.

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>
person ani    schedule 28.08.2012