tob*_*n9e 3 python treeview pygobject gtk3 gdkpixbuf
我在加载文件或在Gtk TreeView(GTK3的Python绑定)的一列中显示颜色时遇到困难.从QGIS中获取的示例在第一行显示图标,在第二行显示蓝色圆圈.颜色取自图层属性:

我的代码看起来像这样,但不会将icon.png文件加载到同一目录中:
#!/usr/bin/python3
from gi.repository import Gtk, Gdk, GdkPixbuf
class MyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.set_default_size(200, 200)
self.liststore = Gtk.ListStore(GdkPixbuf.Pixbuf, str)
self.treeview = Gtk.TreeView(model=self.liststore)
symbol1 = GdkPixbuf.Pixbuf.new_from_file("icon.png")
self.liststore.append([symbol1, "This is a symbol1"])
symbol2 = Gtk.IconTheme.get_default().load_icon("gtk-cut", 64, 0)
self.liststore.append([symbol2, "This is symbol2"])
px_renderer = Gtk.CellRendererPixbuf()
px_column = Gtk.TreeViewColumn("Icon", px_renderer)
self.treeview.append_column(px_column)
str_renderer = Gtk.CellRendererText()
str_column = Gtk.TreeViewColumn("Name", str_renderer, text=1)
self.treeview.append_column(str_column)
self.add(self.treeview)
win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
Run Code Online (Sandbox Code Playgroud)
GTK3 pixbuf的文档在这里:
PyGTK的旧例子就在这里,但是处理它的方式确实发生了变化:
这个问题可以解决的PyGTK2.0类似,你需要连接的两个对象CellRendererText和CellRendererPixbuf的一个对象TreeViewColumn,然后调用set_cell_data_func列的方法来设置数据返回器功能的细胞.这是一个很小的复杂(见下面的代码):
from gi.repository import Gtk, Gdk, GdkPixbuf
class MyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.set_default_size(200, 200)
self.liststore = Gtk.ListStore(str, str)
self.treeview = Gtk.TreeView(model=self.liststore)
self.liststore.append(["icon.png", "This is a symbol1"])
px_renderer = Gtk.CellRendererPixbuf()
px_column = Gtk.TreeViewColumn('')
px_column.pack_start(px_renderer, False)
str_renderer = Gtk.CellRendererText()
px_column.pack_start(str_renderer, False)
# set data connector function/method
px_column.set_cell_data_func(px_renderer, self.get_tree_cell_pixbuf)
px_column.set_cell_data_func(str_renderer, self.get_tree_cell_text)
self.treeview.append_column(px_column)
self.add(self.treeview)
def get_tree_cell_text(self, col, cell, model, iter, user_data):
cell.set_property('text', model.get_value(iter, 1))
def get_tree_cell_pixbuf(self, col, cell, model, iter, user_data):
cell.set_property('pixbuf', GdkPixbuf.Pixbuf.new_from_file(model.get_value(iter, 0)))
if __name__ == '__main__':
win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
Run Code Online (Sandbox Code Playgroud)
你可以使用pygtk2.0的文件关于TreeViewColumn.set_cell_data_func方法,阅读关于PyGTK2.0的重要页面CellRenderers以及可以在PyGTK的版本3上有用的特殊属性:)