pic*_*ney 1 python gtk postgresql
我试图了解以下概念,但我阅读的所有文档都将所有文档捆绑在一起,而没有解释它们中的任何一个真正是什么,因此我不知道如何正确使用它们中的任何一个. 如果有人能给出某种现实世界的类比,那将大有帮助。
TreeView ListView(这甚至是一件事吗?) TreeStore ListStore TreeModel 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"
Run Code Online (Sandbox Code Playgroud)
我在上面使用了 ListStore,因为它看起来最合适。但也许我应该使用 Treestore,或者一个简单的列表,或者一个数组……很容易看出字符串是什么,或者一个整数,一个浮点数,但是这些列表/树/模型/商店实际上是什么样子的或者做什么?
几年前我不得不放弃用 C 编码,因为我无法理解多态链表是什么,而这次我非常想避免与 python 相同的命运。
您对上面的 GtkListStore 代码有正确的想法:它是一个数据存储,其工作方式与 SQL 表非常相似。事实上,您会发现 GtkTreeView 基础结构的工作方式类似于 SQL 表。您的Gtk.ListStore()构造函数调用直接映射到CREATE TABLE并且您的append()调用直接映射到INSERT ROW.
需要注意的重要一点是 GtkListStore 中的列从左到右编号,从 0 开始,而不是命名。这将是重要的一点。
GtkListStore 和 GtkTreeStore 之间的区别在于后者允许您将行作为其他行的子行,就像文件浏览器中的文件夹树一样。子行必须与父行具有相同的列格式。
GtkListStore 和 GtkTreeStore 都是 GtkTreeModel 的实现,它是一个接口。据我所知,Python 没有像接口这样的直接概念,所以只需将接口想象成一个抽象基类,其中没有默认实现并且每个函数都必须定义。GtkTreeModel 指定了允许 GtkTreeView 在屏幕上显示数据的方法。
所以现在唯一的问题是如何将 GtkTreeView 连接到 GtkTreeModel/GtkListStore/GtkTreeStore?
正如您在 SQL 中所记得的那样,表的每一列都有特定的数据类型。使用 GtkTreView,一列中的所有单元格都具有相同的单元格渲染器。单元格渲染器使用 GObject属性绘制文本、图片、复选框等。您可能已经使用过属性:text是 GtkLabelsactive上的属性,是 GtkCheckButtons 上的属性等。单元格渲染器的属性不仅指定要绘制的数据,还指定如何绘制数据。
当您将“属性”(在函数名称中)提供给 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
Run Code Online (Sandbox Code Playgroud)
现在剩下的就是将列添加到 GtkTreeView 并将您的 GtkListStore 设置为 GtkTreeView 的模型(使用set_model())。如果一切顺利,您应该会在 GtkTreeView 中看到您的数据。
GtkTreeView 不提供自己的滚动条。确保将您的 GtkTreeView 放在 GtkScrolledWindow 中以获取它们。
有一个 GtkListBox,但它与此完全无关。
希望这有助于解决问题!如果没有,请随时指出您不理解的内容,我会相应地修改此答案。
更新:为了回应您的评论,询问为什么 GtkTreeView 像这样工作,而不是管理所有数据本身,并且只具有像add_row()and 之类的功能set_cell_value()。这种设计有几个优点:
| 归档时间: |
|
| 查看次数: |
511 次 |
| 最近记录: |