PyGObject中Gtk.TreeView内的Spinner无法转动问题
让Gtk.TreeView里的Gtk.CellRendererSpinner转动起来
我明白你的问题了——你的Spinner已经显示出来,但就是一动不动对吧?这其实是Gtk.CellRendererSpinner的一个小特性:它的动画不是自动跑起来的,哪怕你把active属性绑定到了模型的布尔值,也得主动更新它的动画进度才能让它转起来。
问题根源
这个渲染器靠pulse属性控制动画帧的进度,我们需要不断递增这个值(从0到100循环),让它的状态持续变化,Gtk才会重新绘制Spinner的转动效果。光设置active=True只是告诉它“可以转了”,但没给它动力。
修改后的完整代码
咱们直接改你的代码,加上必要的逻辑:
#!/usr/bin/env python3 import random import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk class TreeView(Gtk.TreeView): def __init__(self): # 模型新增第三列,用来存储spinner的pulse值(动画进度) self.model = Gtk.ListStore.new([bool, int, int]) for i in range(5): # 初始化pulse为0 self.model.append([random.choice([True, True, False]), i, 0]) # view Gtk.TreeView.__init__(self, self.model) # column bool (as spinner) self.spinner_renderer = Gtk.CellRendererSpinner.new() # 同时绑定active和pulse属性到模型列 col_bool = Gtk.TreeViewColumn('bool', self.spinner_renderer, active=0, pulse=2) self.append_column(col_bool) # column int col_int = Gtk.TreeViewColumn('int', Gtk.CellRendererText(), text=1) self.append_column(col_int) # 添加帧回调,每帧更新spinner的pulse值 Gtk.widget_add_tick_callback(self, self.update_spinners, None) def update_spinners(self, widget, frame_clock, user_data): # 遍历模型里的每一行 for row in self.model: # 如果spinner是激活状态 if row[0]: # pulse值递增,超过100重置为0 row[2] = (row[2] + 1) % 100 # 返回True让回调持续触发 return True class Window(Gtk.Window): def __init__(self): Gtk.Window.__init__(self, title='Mein Gtk-Fenster') self.set_default_size(100, 120) self.view = TreeView() self.add(self.view) self.connect('destroy', Gtk.main_quit) self.show_all() if __name__ == '__main__': win = Window() Gtk.main()
关键改动说明
- 模型扩展:给
ListStore加了第三列int类型,用来保存每个Spinner的动画进度值 - 属性绑定:把SpinnerRenderer的
pulse属性绑定到新的模型列(索引2) - 帧回调:用
Gtk.widget_add_tick_callback注册了一个每帧触发的函数,在里面遍历模型,对激活状态的Spinner更新pulse值,让动画持续运行
现在运行代码,你会看到所有active=True的Spinner都开始转动了!如果后续修改模型里的布尔值,Spinner也会相应地启动或停止转动。
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

