将索引添加到树视图的每一行

时间:2016-08-02 07:43:55

标签: python-3.x treeview gtk3

这是我正在使用的treeview,用于显示来自多个来源的文本(使用打开文件对话框的文件等)。它也应该具有编辑行的能力。 (请不要介意bookstore /= entries的大小,我已将其删除以使其缩短)

class treeview():
    full_list = []
    booklist = []
    indxcount = 0
    bookstore = Gtk.ListStore(int, str, str, str, str, str, str, str,                            
                              str, str, str, str)
    viewstore = Gtk.ListStore(str, str)
    entries = ["Type", "Id", "Title", "Author", "Journal", "Year", "Publisher",
               "Page", "Address", "Annote", "Booktitle", "Chapter"]

    def __init__(self):
        self.cell = cell.cell_renderer()
        self.view = Gtk.TreeView(model=self.bookstore)
        for i, column_title in enumerate(["Type", "Key", "Title",
                                      "Author", "Journal", "Year"]):
            renderer = Gtk.CellRendererText()
            renderer.set_property("wrap-width", 300)
            if i > 3:
                renderer.set_property("wrap-width", 100)
            renderer.set_property("wrap-mode", 0)
            column = Gtk.TreeViewColumn(column_title, renderer, text=i+1)
            self.view.append_column(column)
            # column.clear()
            for cid in range(0, 6):
                column.set_sort_column_id(cid)

    def viewer(self, booklist, act=-1):
        for ref in booklist:
            lref = list(ref)
            treeview.indxcount += 1
            lref = list(ref)
            lref.insert(0, (treeview.indxcount))

            self.bookstore.append(lref)
            treeview().full_list.append(ref)


        self.current_filter_language = None

问题是,因为我是人工放置行索引,所以它给出了更多问题然后解决方案(例如,如果我重新打开另一个文件,treeview.indxcount = last indxcount of previously open files + 1)。

但是因为它是从文件打开的,所以我无法从gtk_tree_selection_get_selected_rows获得indx。那么,我怎样才能获得索引?

另一个潜在的功能可能是GtkTreeCellDataFunc(),但我不确定如何使用,所以我没有管理它。

请帮助。

对jcoppens的回复:嗨, 提供一个完整的例子有点棘手,因为它应该打开一个文件(包括文件打开对话框和一个完整的窗口),这可能不再是一个最小的例子了。

但是,排序方面,我的问题是treeview.indxcount += 1行。请允许我更详细地解释一下这个问题:

说,我从包含6个项目的文件中读取数据(因此,len(booklist)=6)。因此,在完成此步骤后,treeview.indxcount = 6

现在,考虑一下,我正在加载另一个这样的文件,它将覆盖现有数据。但是,在这种情况下,treeview.indxcount将从7开始。我试图将treeview.indxcount = 0放在FileOpenDialog中,但不知何故,这不会影响观众。

因此,简而言之,我正在尝试在数据加载时计算树视图中的行号。

我不确定这种解释是否能解决问题。

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题。您的班级名为treeview,但它不是树视图。如果你从Gtk.Treeview得到它,可能会更好(不那么令人困惑):

class treeview(Gtk.TreeView):
    def __init__(self):
        super(treeview, self).__init__()
        bookstore = Gtk.ListStore(int, str, str, str, str, str, str, str,                            
                                  str, str, str, str)
        self.set_model(self.bookstore)

        for i, column_title in enumerate(["Type", "Key", "Title",
                                  "Author", "Journal", "Year"]):
            renderer = Gtk.CellRendererText()
            renderer.set_property("wrap-width", 100 if i > 3 else 300)
            renderer.set_property("wrap-mode", 0)
            column = Gtk.TreeViewColumn(column_title, renderer, text=i)
            self.append_column(column)
            for cid in range(0, 6):
                column.set_sort_column_id(cid)
...

现在,self实际上是指树视图。然后,在方法viewer中,递归调用textview(),创建类的新实例。这似乎很危险。

booklist的格式是什么?如果您将书单作为序列序列(例如,元组元组或列表列表)传递,其中每个内部序列是要在TreeView中显示的行,那么(我认为)您不需要indexcnt

你会有类似的东西:

tv = treeview()
tv.viewer([["1984", "Asimov"], 
           ["Tcl and Tk", "Welch"], 
           ["Linear systems", "Moriarty"]])

这只是部分答案 - 但我无法在“评论”中真正格式化代码。如有必要,我会对其进行编辑。