这是我正在使用的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(),但我不知道如何使用,所以我没有管理它。
帮帮忙吧。
给的回复: Hi,给出一个完整的例子有点棘手,因为它应该打开一个文件(包括一个文件打开的对话框和一个完整的窗口),这可能不是一个最小的例子。
但是,从某种意义上说,我的问题是treeview.indxcount += 1行。请允许我更详细地解释这个问题:
比如说,我从一个包含6个项的文件(所以,len(booklist)=6 )中读取数据。因此,在完成这个步骤之后,treeview.indxcount = 6。
现在,考虑一下,我正在加载另一个这样的文件,它将覆盖现有的数据。但是,在这种情况下,treeview.indxcount将从7开始。我试着把treeview.indxcount = 0放进FileOpenDialog,但不知怎么的,这并没有影响观众。
因此,简单地说,我试图在加载数据时计算treeview中的行号。
我不知道这个解释是否能澄清问题。
发布于 2016-08-09 16:00:42
您的代码中存在一些问题。您的类名为treeview,但它不是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实际上是指treeview。然后,在方法viewer中递归调用textview(),创建类的新实例。这听起来很危险。
booklist的格式是什么?如果你把书单作为序列传递(例如。一个元组或列表列表),其中每个内部序列都是要在TreeView中显示的一行,那么(我认为)您不需要索引not。
你会得到这样的东西:
tv = treeview()
tv.viewer([["1984", "Asimov"],
["Tcl and Tk", "Welch"],
["Linear systems", "Moriarty"]])这只是一个部分的答案-但我不能真正格式化代码‘注释’。必要的话我会编辑的。
https://stackoverflow.com/questions/38714554
复制相似问题