如何从不同的模块访问treeview内容?

时间:2018-10-08 18:00:45

标签: python treeview gtk

我在不同的模块中有两个类,每个类都是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)

如何从第二个树视图(类B)访问第一个树视图(类A)中的行位置? (我尝试过不同的方法)我希望进一步搜索的提示,不需要固定的代码。该代码在一个类/一个模块中有效。

1 个答案:

答案 0 :(得分:0)

您不应从第二类访问树状视图中的行位置。相反,您应该连接到一个信号,该信号指示用户选择已更改。有两种方法可以做到这一点。下面的代码是C,但是很容易将其转换为python。

  1. TreeView的“行激活”。

    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的"changed"。您可以从TreeView获取GtkTreeSelection

    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小部件中使用的东西。但是,您还需要一种方法来匹配两个列表中的项目。