GTK4 Python开发中TreeView数据无法显示的问题求助
解决GTK4 TreeView行内无数据显示的问题
你碰到的这个问题很常见——TreeViewColumn没有和TreeStore中的数据列绑定,导致CellRendererText不知道该从模型里取什么内容来渲染,所以才会出现有行但空数据的情况。
问题根源
GTK的TreeView基于MVC模式设计,视图(TreeView/TreeViewColumn)必须明确和模型(TreeStore)的字段做绑定才能正确展示数据。你之前只创建了列和渲染器,但没告诉渲染器要对应模型里的哪一列数据,自然就显示空白了。
两种修复方案
方案1:创建列时直接绑定(推荐)
在初始化TreeViewColumn的时候,通过关键字参数指定CellRenderer的text属性对应模型的列索引(TreeStore定义的列顺序从0开始计数):
# 0对应TreeStore的第一个str列,1对应第二个str列 colA = Gtk.TreeViewColumn("Title A", Gtk.CellRendererText(), text=0) colB = Gtk.TreeViewColumn("Title B", Gtk.CellRendererText(), text=1)
方案2:用add_attribute方法绑定
如果需要后续动态调整绑定关系,可以先创建列,再手动为渲染器添加属性绑定:
colA = Gtk.TreeViewColumn("Title A", Gtk.CellRendererText()) # 获取列中的CellRenderer,绑定text属性到模型第0列 colA.add_attribute(colA.get_cells()[0], "text", 0) colB = Gtk.TreeViewColumn("Title B", Gtk.CellRendererText()) colB.add_attribute(colB.get_cells()[0], "text", 1)
修改后的完整代码
import gi gi.require_version('Gtk', '4.0') from gi.repository import Gtk class Example(Gtk.Application): def __init__(self, **kwargs): super().__init__(**kwargs) self.connect('activate', self.on_activate) def on_activate(self, app): self.win = MainWindow(application=app, title="Example TreeView") self.win.present() class MainWindow(Gtk.ApplicationWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.set_default_size(600, 400) # 修改这里的列创建代码,添加数据绑定 colA = Gtk.TreeViewColumn("Title A", Gtk.CellRendererText(), text=0) colB = Gtk.TreeViewColumn("Title B", Gtk.CellRendererText(), text=1) self.treeStore = Gtk.TreeStore(str, str) self.tree = Gtk.TreeView.new_with_model(self.treeStore) self.tree.append_column(colA) self.tree.append_column(colB) for i in range(0, 10): self.treeStore.append(None, [str(i), "Hi"]) self.set_child(self.tree) app = Example() app.run()
运行修改后的代码,你就能看到每行都正确显示对应的数据了。
内容的提问来源于stack exchange,提问作者jarinox
相关产品推荐
相关产品推荐

