【发布时间】:2020-04-18 19:51:20
【问题描述】:
我需要编写一个自定义的Gtk.CellRenderer(我们称之为CellRendererToogleWithNone),其行为类似于Gtk.CellRendererToggle,但不仅支持True 和False,我还希望它支持None应该显示为这样的不一致状态:
在切换时,我想以某种定义的顺序旋转,例如:True -> False -> None (但这可能是最容易的部分,我仍然认为我提到过)
我也不知道如何让它与 TreeStore 一起工作,因为如果我这样做了
self.treestore = Gtk.TreeStore.new(types = (bool,))
iter = self.treestore.append(parent = None, row = (None,))
它将任何None 值转换为False,因为bool 似乎不允许None 值
我没有在网上找到任何有用的自定义 Gtk.CellRenderer 示例。
我想通过继承 Gtk.CellRenderer 而不是继承 Gtk.CellRendererToggle 来做到这一点,因为这也可以作为一个有用的示例来实现更多像这样的单元格渲染器。
我只能猜测我必须为TreeStore 定义一些自定义数据类型,比如bool_or_none 而不是bool(也不知道该怎么做)并在其中保留我自己的Gtk.ToggleButton我的自定义CellRendererToogleWithNone。
编辑 0:
This post 关于如何编写自定义 Gtk.CellRenderer 提供了一些提示,这些提示可能可以重复使用,但不能解决我的问题。它没有显示如何使 Gtk.TreeStore 接受 None 变量的 bool 值,我不明白那里的一切。它甚至不使用 Gtk.Button,而是似乎在我猜可能是父级的小部件内绘制了一个框。我不想画我自己的 Toggle,我想重用 Gtk.ToggleButton 和它的 inconsistent 属性
编辑 1:
由于自定义单元格渲染器似乎并不容易,我认为在 python 中查看一个最小的工作示例会特别有用。我还应该提到,我希望尽可能紧凑地显示数据,这不包括建议的解决方法,例如为一个值设置两个切换。
【问题讨论】:
-
1) 您可以将值存储在 GVariant 中或创建具有 3 个可能值的自定义类,之后您可以创建类型为
object的列。我不确定它是否必须是 GObject 子类。 2) 编写自定义 CellRenderers 并不是一件容易的事,因为它们不是传统的小部件,因为您必须手动渲染所有内容。请查看'CellRendererToggle source code` 以获取提示。 -
3) 另一种方法是使用
GtkCellRendererToggle和两列:一列用于"active"属性,一列用于"inconsistent" -
@Alexander 感谢 GVariant 的提示。这正是我在这里问的原因。我似乎不太容易实现单元渲染器,所以我希望有人对它们有经验。关于您的第二条评论,我的目标之一是尽可能紧凑地显示数据,因此将切换数量翻倍对我来说实际上是不可能的。
标签: python toggle gtk3 gtktreeview