【问题标题】:How to render Gtk.DrawingArea() in a Gtk.Treeview()?如何在 Gtk.Treeview() 中渲染 Gtk.DrawingArea()?
【发布时间】:2016-01-09 04:37:47
【问题描述】:

我在将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()之类的吗?

【问题讨论】:

  • 绘图区从何而来?如果您自己绘制,为什么不实现自定义单元格渲染器?
  • @user4815162342 是的,这幅画是我画的。我想制作自己的 cellrender,但我刚刚找到了 C 文档,我想我会很幸运的
  • GtkTreeView 背后的理念是保持数据和 UI 的清晰分离;存储(模型)包含渲染器知道如何渲染的数据。该模型不是为包含小部件而设计的,树视图也不是可以嵌入它们的容器,因此没有渲染器可以显示任意小部件。由于您已经知道如何绘制数据,因此您需要创建自定义渲染器而不是绘图区域。从 Gtk.CellRenderer 继承并通过实现 on_render 方法和 on_get_size 在其渲染虚拟方法中进行绘图。
  • @user4815162342 感谢这些大行!连同这个this examples,我可能能够做到这一点:)
  • 好的,我现在发布了评论的扩展版本作为答案,以供将来参考。

标签: python gtk3


【解决方案1】:

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

您的代码无法工作,因为没有显示任意小部件的单元格渲染器。该模型既不是为托管 GUI 对象而设计的,树视图也不是一个小部件容器。树形视图被设计成能够扩展到数万行,而这无法通过为每个单元格使用单独的小部件来实现。

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

【讨论】:

  • 我只想指出,您的论点“树视图旨在能够扩展到数万行,而这无法通过为每个单元格使用单独的小部件来实现”是错误的并且一直如此。所有其他现代 GUI 工具包现在都可以即时创建这些小部件。但不幸的是,即使在 GTK4 中,也没有计划支持回收商列表小部件,因为 GTK 缺乏实施它的资金和个人支持。
  • @Lothar 动态创建小部件是有意义的;我指的是提前创建所有小部件,如 VBox 或类似的。
猜你喜欢
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2019-12-26
相关资源
最近更新 更多