You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:46:23