这是我正在使用的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
中,但不知何故,这不会影响观众。
因此,简而言之,我正在尝试在数据加载时计算树视图中的行号。
我不确定这种解释是否能解决问题。
答案 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"]])
这只是部分答案 - 但我无法在“评论”中真正格式化代码。如有必要,我会对其进行编辑。