我需要编写一个行为与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(也不知道该怎么做),并在自定义。编辑0:关于如何编写自定义Gtk.ToggleButton的This post提供了一些提示,这些提示可能可以重用,但不能解决我的问题。它没有显示如何使CellRendererToogleWithNone接受Gtk.CellRenderer变量的Gtk.TreeStore值,我也不了解那里的所有内容。它甚至不使用Gtk.Button,而是似乎在小部件内部绘制一个框,我猜这可能是父级。我不想绘制自己的Toggle,我想重用None及其bool属性编辑1:由于似乎自定义单元格渲染器似乎并不容易,所以我认为在python中查看一个最小的工作示例将特别有用。我还应该提到,我想尽可能紧凑地显示数据,这不包括建议的解决方法,例如对一个值进行两次切换。 最佳答案 问题:自定义Gtk.CellRendererToggle,在“真”,“无”(显示为不一致)和“假”之间切换。您被误导了,设置Gtk.CellRendererToggle标志不是inconsistant对象的一部分。它已经实现了。您必须改为实现Gtk.TreeCellDataFunc。  我也希望它支持None        我不理解它是否可以使用None值,    因此,我将类型int与值一起使用:[False, True, 2]      注意:      在def on_toggle(...)中,model的值将更改为0 == False和1 == True。如果希望它保持为boolean类型,请相应实施。  您应该知道,值2也将求值为True。  参考:Gtk.TreeViewColumn.set_cell_data_func  使用此函数代替设置列值的标准属性映射,应适当设置self的单元格渲染器的值。Gtk.TreeCellDataFunc  设置单元格属性的功能,而不仅仅是使用单元格和模型之间的直接映射。这对于自定义单元格渲染器很有用  实现:核心点:.set_cell_data_func(cell_renderer, .set_status)class TreeViewColumnTriState(Gtk.TreeViewColumn): def __init__(self, title='', model=None, **attributes): cell_renderer = Gtk.CellRendererToggle() cell_renderer.connect("toggled", self.on_toggle, model) self.inconsistent = attributes.pop('inconsistent', None) super().__init__(title, cell_renderer, active=0, **attributes) self.set_cell_data_func(cell_renderer, self.set_status) def set_status(self, column, cell, model, _iter, *ignore): if model.get_value(_iter, 0) == self.inconsistent: cell.set_property('inconsistent', True) else: cell.set_property('inconsistent', False) def on_toggle(self, cell, path, model, *ignore): if path is not None: model = model[model.get_iter(path)] model[0] += 1 if model[0] == 3: model[0] = 0  用法:import gigi.require_version('Gtk', '3.0')from gi.repository import Gtk, GLibclass App(Gtk.ApplicationWindow): def __init__(self): super().__init__() self.connect("destroy", Gtk.main_quit) model = Gtk.ListStore(int) # Some initial data for n in [False, True, 2]: model.append([n]) col = TreeViewColumnTriState("Foo", model, inconsistent=2) tv = Gtk.TreeView(model) tv.append_column(col) self.add(tv) self.show_all()if __name__ == "__main__": main = App() Gtk.main()使用Python测试:3.5-gi .__ version __:3.22.0关于python - 自定义Gtk.CellRenderer,在True(无)(显示为不一致)和False(Python GTK 3)之间切换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59524524/
10-14 18:25
查看更多