首页 > 解决方案 > 如何从不同的模块访问树视图内容?

问题描述

我在不同的模块中有两个类,每个都是 gtk.TreeView/gtk.ListStore。双击第一个树视图(目录列表)中的行后,程序应根据双击的行在另一个树视图(也是目录列表)中显示一些内容。

文件_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)

文件_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)

文件_3.py

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

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

标签: pythontreeviewgtk

解决方案


您不应该从第二类访问树视图中的行位置。相反,您应该连接到一个信号,该信号表明用户选择已更改。有两种方法可以做到这一点。下面的代码是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. 树选择的"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 小部件中使用的东西。但是您还需要一种方法来匹配两个列表中的项目。


推荐阅读