Условный CellRenderCombo в pyGTK TreeView - PullRequest
1 голос
/ 21 апреля 2010

У меня есть два столбца TreeView, прикрепленный к ListStore. Оба столбца представляют собой комбинированные списки CellRenderCombo.

Когда пользователь выбирает запись в первом поле, мне нужно динамически загрузить набор параметров во втором.

Например, поведение, которое я хочу:

On row 0, the user selects "Alphabet" in the first column box.
     The second column box is populated with the letters "A-Z".
On row 1, the user selects "Numbers" in the first column box.
     The second column box is populated with the numbers "0-9".
On row 2, the user selects "Alphabet" in the first column box.
     The second column box is populated with the letters "A-Z".
etc.

Кто-нибудь знает, как это сделать, или видел какие-либо проекты с открытым исходным кодом pygtk или gtk, которые имеют похожее поведение, которое я могу анализировать?

1 Ответ

0 голосов
/ 21 апреля 2010

Во-первых, вам необходимо связать model свойство второго рендера из модели, например:

gtk.TreeViewColumn ('...', gtk.CellRendererCombo (), text = N, model = M)

где M - номер столбца, в котором хранятся модели (вероятно, gtk.ListStore). Или используйте любой другой метод привязки свойств из столбцов модели.

Затем подключитесь к сигналу changed первого рендерера. В обратном вызове вам необходимо соответственно изменить модель, используемую для комбо второго рендерера (т.е. значение в столбце M). Могу поспорить, что вы можете использовать одни и те же модели в разных строках, то есть одну для чисел, одну для букв, не создавая больше, но я не уверен. Другими словами, обратный вызов может выглядеть примерно так (store - это основной gtk.ListStore, X - это столбец со значением первого комбо):

def combo1_changed (combo, path, iter):
    main_iter = store.get_iter (path)
    selected  = store.get_value (main_iter, X)
    if selected == 'Alphabet':
        store.set_value (main_iter, M, alphabet_list_store)
    elif selected == 'Numbers':
        store.set_value (main_iter, M, number_list_store)
    ...
...