Как получить доступ к контенту в виде дерева из другого модуля? - PullRequest
0 голосов
/ 08 октября 2018

Я получил два класса в разных модулях, каждый из которых представляет собой gtk.TreeView / gtk.ListStore.После двойного щелчка по строке в первом древовидном представлении (список каталогов) программа должна отобразить некоторый контент в другом древовидном представлении (также в списке каталогов) в зависимости от того, в какой строке щелкнули дважды.

file_1.py

class A():
  def _init_(self):
    ...
    #this content (catalogs_1_list) is fixed to display
    #not using self.catalogs_1, etc.
    catalogs_1.set_model(catalogs_1_list)

file_2.py

class B(don't want inheriting A):
  def _init_(self):
    ...
    #this content (catalogs_2_list) should be changing depending on double-clicked row in tree view from class A
    #not using self.catalogs_2, etc.
    catalogs_2.set_model(catalogs_2_list)

file_3.py

class start_app():
  def _init_(self):
    containers(imported classes from modules)

Как получить доступ к позиции строки в первом дереве (класс A) из второго деревавид (класс B)?(Я пробовал разные подходы). Я буду признателен за подсказки для дальнейшего поиска, фиксированный код не требуется.Код работал, когда он был в одном классе / одном модуле.

1 Ответ

0 голосов
/ 09 октября 2018

Вы не должны получать доступ к позиции строки в виде дерева из второго класса.Вместо этого вам следует подключиться к сигналу, который указывает, что выбор пользователя изменился.Есть 2 способа сделать это.Код ниже C, но его легко преобразовать в python.

  1. TreeView "row-activated".

    void
    row_activated (GtkTreeView       *tree_view,
                   GtkTreePath       *path,
                   GtkTreeViewColumn *column,
                   gpointer           user_data)
    {
      GtkTreeIter iter;
      GtkTreeModel *model;
      gchar *id;
    
      model = gtk_tree_view_get_model (tree_view);
    
      if (!gtk_tree_model_get_iter (model, &iter, path))
       return;
    
      gtk_tree_model_get (model, &iter, ID_COL, &id, -1);
    }
    
  2. TreeSelection's "changed".Вы можете получить GtkTreeSelection из TreeView.

    static void
    changed (GtkTreeSelection *select,
             gpointer          udata)
    {
      GtkTreeIter iter;
      GtkTreeModel *model;
      gchar *id;
    
      if (!gtk_tree_selection_get_selected (select, &model, &iter))
        return;
    
      gtk_tree_model_get (model, &iter, ID_COL, &id, -1);
    }
    

ID_COL - это то, что я использую в своем виджете TreeView.Но вам также нужен способ сопоставления элементов из обоих списков.

...