- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Python 中开发 GTK 应用程序,但我真的坚持正确使用 gtk.TreeStore
.我的主要问题:我已经解析了一些 JSON,并且我有自己的数据结构,它基本上是一个 Python 列表和两种对象:一种表示项目集合(集合不能嵌套),另一种表示项目(它可能出现在列表中以及集合中)。
我已经熟悉 TreeStore
的基本用法并设法在屏幕上正确呈现项目。我不知道如何处理树存储只能存储 gobject 类型的事实(此时我不确定,因为我对 gobject 类型系统了解不多)。 C 的文档列出了以下(PixBuf 除外)可以插入并自动映射到 Python 数据类型的基本类型:
As an example, gtk_tree_store_new (3, G_TYPE_INT, G_TYPE_STRING, GDK_TYPE_PIXBUF); will create a new GtkTreeStore with three columns, of type int, string and GdkPixbuf respectively.
GType
.文档中的链接直接指向本段:
A numerical value which represents the unique identifier of a registered type.
str
之外没有插入其他数据类型。和
int
等等
GObject
派生但这没有帮助。 str
这样的简单类型。或
int
匹配我之前插入的项目。这样的属性必须是一个键,你仍然会用解析结果搜索列表,这是无效的。
TreeModel
可能是一个可行的挑战。直到我在
tutorial for GTK 2 中读到此内容:
However, all this comes at a cost: you are unlikely to write a useful custom model in less than a thousand lines, unless you strip all newline characters. Writing a custom model is not as difficult as it might sound though, and it may well be worth the effort, not least because it will result in much saner code if you have a lot of data to keep track of.
最佳答案
问题解决了!对于遇到同样问题的其他人,我将收集一些有用的资源和我的示例代码。如果你知道怎么做也没关系,但它真的没有记录在案。
GObject
具有属性:CellRendererText
的自定义值,包括用于实现传递给 set_cell_data_func
的函数的有用片段(需要适应 TreeView
)from gi.repository import Gtk
from gi.repository import GObject
class Person (GObject.GObject):
name = GObject.property(type=str)
age = GObject.property(type=int)
gender = GObject.property(type=bool, default=True)
def __init__(self):
GObject.GObject.__init__(self)
def __repr__(self):
s = None
if self.get_property("gender"): s = "m"
else: s = "f"
return "%s, %s, %i" % (self.get_property("name"), s, self.get_property("age"))
class MyApplication (Gtk.Window):
def __init__(self, *args, **kwargs):
Gtk.Window.__init__(self, *args, **kwargs)
self.set_title("Tree Display")
self.set_size_request(400, 400)
self.connect("destroy", Gtk.main_quit)
self.create_widgets()
self.insert_rows()
self.show_all()
def create_widgets(self):
self.treestore = Gtk.TreeStore(Person.__gtype__)
self.treeview = Gtk.TreeView()
self.treeview.set_model(self.treestore)
column = Gtk.TreeViewColumn("Person")
cell = Gtk.CellRendererText()
column.pack_start(cell, True)
column.set_cell_data_func(cell, self.get_name)
self.treeview.append_column(column)
vbox = Gtk.VBox()
self.add(vbox)
vbox.pack_start(self.treeview, True, True, 0)
button = Gtk.Button("Retrieve element")
button.connect("clicked", self.retrieve_element)
vbox.pack_start(button, False, False, 5)
def get_name(self, column, cell, model, iter, data):
cell.set_property('text', self.treestore.get_value(iter, 0).name)
def insert_rows(self):
for name, age, gender in [("Tom", 19, True), ("Anna", 35, False)]:
p = Person()
p.name = name
p.age = age
p.gender = gender
self.treestore.append(None, (p,))
def retrieve_element(self, widget):
model, treeiter = self.treeview.get_selection().get_selected()
if treeiter:
print "You selected", model[treeiter][0]
if __name__ == "__main__":
GObject.type_register(Person)
MyApplication()
Gtk.main()
关于GTK+ 3.0 : How to use a Gtk. 带有自定义模型项目的 TreeStore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178743/
我是一名优秀的程序员,十分优秀!