如何在Gtk.Treeview()中渲染Gtk.DrawingArea()?

时间:2016-01-07 18:30:58

标签: python gtk3

我在向Gtk.DrawingArea()呈现Gtk.TreeView()时遇到了一些问题。这可能吗?

到目前为止,我有这段代码:

window = Gtk.Window()
window.connect("destroy", lambda q: Gtk.main_quit())

darea=Gtk.DrawingArea()
darea.modify_bg(Gtk.StateFlags.NORMAL, Gdk.Color(1,1,1))

liststore = Gtk.ListStore(Gtk.DrawingArea)
liststore.append([darea])
liststore.append([darea])
treeview = Gtk.TreeView(model=liststore)
window.add(treeview)

treeviewcolumn = Gtk.TreeViewColumn("Drawing Areas")
treeview.append_column(treeviewcolumn)

cellrenderer = Gtk.CellRendererPixbuf() #Gtk.Drawable() #Gtk.CellRendererText()
treeviewcolumn.pack_start(cellrenderer, True)
treeviewcolumn.add_attribute(cellrenderer, "d areas", 0)

window.show_all()

Gtk.main()

但是当然它并不起作用,因为我试图用Gtk.CellRendererPixbuf()来渲染它。有没有Gtk.CellRendererDrawingArea()

1 个答案:

答案 0 :(得分:1)

GtkTreeView背后的想法是在基础数据(模型)和用户界面(视图)之间保持清晰的分离。树存储仅包含数据,渲染器是知道如何显示模型数据的独立对象。通常,渲染器的属性使用add_attribute GtkTreeViewColumn方法连接到数据模型的列。例如,要将模型的第一列呈现为文本,可以实例化文本渲染器并调用textcolumn.add_attribute(textrenderer, "text", 0)

您的代码无法正常工作,因为没有显示任意小部件的单元格渲染器。既不是用于托管GUI对象的模型,也不是树视图是窗口小部件容器。树视图旨在能够扩展到数万行,这对于每个单元使用单独的小部件无法实现。

在您的情况下,由于您已经知道如何绘制数据,因此创建自定义渲染器并使用它来绘制列而不是尝试将绘图区域嵌入到树视图中应该很简单。继承自Gtk.CellRenderer,并通过实施render方法和on_render在其on_get_size虚拟方法中进行绘制。