gpt4 book ai didi

Python (GTK) : Can someone explain the difference between TreeStore, Listmodel 和所有其他的?

转载 作者:行者123 更新时间:2023-11-29 14:20:43 27 4
gpt4 key购买 nike

我试图了解以下概念,但我阅读的所有文档都将所有内容捆绑在一起,但没有解释它们的真正含义,因此我不知道如何使用它们他们的正确。如果有人能给出某种真实世界的类比,那将大有帮助。

TreeView ListView(这甚至是一件事吗?)树店列表存储树模型TreeIter

我的最终目标是从数据库中读取一组结果并将它们作为可点击项显示在小部件上。我已经了解了查找和检索部分,但事实证明,将结果传回、显示它们并让它们更新要棘手得多。

更新:以下是为了从 postgreSQL 数据库读取结果并将其放入“容器”中,从那里我可以将结果分配给输出对话框:

result = self.lookup_player(search) # this returns a result of cur.fetchall
print result # just to make sure it returns the right things
if len(result) > 0: # make sure there are results
for i in range(0, len(result)): # i used treeiter to see what it did
treeiter=store.append([result[i][0],result[i][1],str(result[i][4])])
print result[i][0],result[i][1],result[i][2],result[i][3],result[i][4],result[i][5],result[i][6],result[i][7],result[i][8],result[i][9],result[i][10]
else:
print "No players found"

我在上面使用了 ListStore,因为它看起来最合适。但也许我应该使用 Treestore,或者一个简单的列表,或者一个数组......很容易看出什么是字符串,或整数、 float ,但这些列表/树/模型/存储实际上是什么样子或做什么?

几年前我不得不放弃用 C 编写代码,因为我无法理解什么是多态链表,这次我迫切希望避免与 Python 重蹈覆辙。

最佳答案

您对上面的 GtkListStore 代码的想法是正确的:它是一个与 SQL 表非常相似的数据存储。事实上,您会发现 GtkTreeView 基础架构的工作方式类似于 SQL 表。您的 Gtk.ListStore() 构造函数调用直接映射到 CREATE TABLE 并且您的 append() 调用直接映射到 INSERT ROW.

需要注意的重要一点是,您的 GtkListStore 中的列是从左到右编号的,从 0 开始,而不是命名。这一点很重要。

GtkListStore 和 GtkTreeStore 之间的区别在于后者允许您将行作为其他行的子行,就像文件浏览器中的文件夹树一样。子行必须具有与父行相同的列格式。

GtkListStore 和 GtkTreeStore 都是 GtkTreeModel 的实现,它是一个接口(interface)。据我所知,Python 没有像接口(interface)这样的直接概念,因此只需将接口(interface)想象成一个抽象基类,其中没有默认实现并且必须定义每个函数。 GtkTreeModel 指定允许 GtkTreeView 在屏幕上显示数据的方法。

所以现在唯一的问题是如何将 GtkTreeView 连接到 GtkTreeModel/GtkListStore/GtkTreeStore?

正如您在 SQL 中所记得的那样,表的每一列都有特定的数据类型。使用 GtkTreView,一列中的所有单元格都具有相同的单元格渲染器。单元格渲染器使用 GObject 属性 绘制文本、图片、复选框等。您可能已经使用过属性:text 是 GtkLabels 上的一个属性,active 是 GtkCheckButtons 上的一个属性,等等。Cell 渲染器的属性不仅指定要绘制的数据, 以及如何绘制它。

当您将“属性”(在函数名称中)提供给 GtkTreeViewColumn(GtkTreeView 中单个列的表示)时,您为调用的函数提供了两件事:单元格渲染器本身和一个属性列号对的列表。

例如,假设您希望表模型的第 0 列提供第一列的文本。以下是创建列的方式:

renderer = Gtk.CellRendererText()            # create a text cell renderer
column = Gtk.TreeViewColumn("Column") # create the column
column.pack_start(renderer, True) # load the renderer...
column.add_attribute(renderer, "text", 0) # ...and tell it to get its text from the first column of the model

现在剩下的就是将列添加到 GtkTreeView 并将 GtkListStore 设置为 GtkTreeView 的模型(使用 set_model())。如果一切顺利,您应该会在 GtkTreeView 中看到您的数据。


GtkTreeView 不提供自己的滚动条。确保将 GtkTreeView 放在 GtkScrolledWindow 中以获取它们。

有一个 GtkListBox,但它与此完全无关。

希望这有助于解决问题!如果不明白,请随时指出您不明白的地方,我会相应地修改此答案。


更新:回应您询问为什么 GtkTreeView 如此工作的评论,而不是管理所有数据本身并仅具有 add_row() 等功能set_cell_value()。这种设计有几个优点:

  • 它使 GtkTreeView 自己的代码在未来更简单和更具扩展性。
  • 它允许有特殊需要的人实现他们自己的 GtkTreeModel 以用作数据存储。例如,编写足够高级或内存消耗大的程序的人可以创建一个直接与 SQL 数据库通信的 GtkTreeModel,而无需在任何地方复制数据。
  • 它允许 GtkTreeView 的多个实例使用相同的数据存储。
  • 它允许其他小部件使用相同的数据存储。 GtkIconView是另一个使用 GtkTreeModel 来存储其数据的小部件(它还使用单元格渲染器来渲染数据)。

关于Python (GTK) : Can someone explain the difference between TreeStore, Listmodel 和所有其他的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28448852/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com