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

PyGTK中如何暂停GObject定时线程?

解决GTK3中GObject定时任务的启停问题

嘿,这问题其实不难,核心就是要记住GObject.timeout_add返回的源ID,用它来控制定时任务的启停。我给你一步步拆解解决方案:

关键知识点

  • GObject.timeout_add(interval, callback) 会返回一个整数类型的源ID,这个ID是用来标识这个定时任务的唯一标识
  • 要停止定时任务,调用 GObject.source_remove(source_id) 传入对应的ID就行
  • 你的refresh_screen函数必须返回True,这样定时任务才会持续循环执行;如果返回False,任务会自动终止

具体实现步骤

  • 首先在你的类里添加一个属性,用来保存定时任务的源ID,初始值设为None,比如:

    self.refresh_source_id = None
    
  • 修改启动按钮的回调函数,确保每次点击时如果已有运行的定时任务,先停止它再重新启动(避免重复创建多个定时任务):

    def on_refreshbutton_clicked(self, widget):
        print("Data..")
        # 如果已有定时任务在运行,先停止
        if self.refresh_source_id is not None:
            GObject.source_remove(self.refresh_source_id)
        # 创建新的定时任务,保存源ID
        self.refresh_source_id = GObject.timeout_add(2000, self.refresh_screen)
    
  • 完善暂停/继续按钮的回调函数,实现状态切换:

    def on_pausebutton_clicked(self, widget):
        if self.refresh_source_id is not None:
            # 当前有运行的定时任务,停止它
            GObject.source_remove(self.refresh_source_id)
            self.refresh_source_id = None
            widget.set_label("继续")  # 切换按钮文本
            print("Paused..")
        else:
            # 当前没有运行的任务,重新启动
            self.refresh_source_id = GObject.timeout_add(2000, self.refresh_screen)
            widget.set_label("暂停")  # 切换按钮文本
            print("Resumed..")
    
  • 别忘了确保你的refresh_screen函数返回True:

    def refresh_screen(self):
        # 这里写你的刷新逻辑
        print("Refreshing screen...")
        return True  # 必须返回True才能让定时任务持续执行
    

完整示例片段

把这些整合到你的GTK类里,大概是这样:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GObject

class YourWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="定时任务启停示例")
        self.refresh_source_id = None  # 初始化源ID

        # 创建按钮布局
        box = Gtk.Box(spacing=6)
        self.add(box)

        refresh_btn = Gtk.Button(label="启动刷新")
        refresh_btn.connect("clicked", self.on_refreshbutton_clicked)
        box.pack_start(refresh_btn, True, True, 0)

        pause_btn = Gtk.Button(label="暂停")
        pause_btn.connect("clicked", self.on_pausebutton_clicked)
        box.pack_start(pause_btn, True, True, 0)

    def on_refreshbutton_clicked(self, widget):
        print("Data..")
        if self.refresh_source_id is not None:
            GObject.source_remove(self.refresh_source_id)
        self.refresh_source_id = GObject.timeout_add(2000, self.refresh_screen)

    def on_pausebutton_clicked(self, widget):
        if self.refresh_source_id is not None:
            GObject.source_remove(self.refresh_source_id)
            self.refresh_source_id = None
            widget.set_label("继续")
            print("Paused..")
        else:
            self.refresh_source_id = GObject.timeout_add(2000, self.refresh_screen)
            widget.set_label("暂停")
            print("Resumed..")

    def refresh_screen(self):
        print("Refreshing screen...")
        return True

if __name__ == "__main__":
    win = YourWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()

这样就能实现点击启动按钮开始每2秒刷新,点击暂停按钮可以停止,再次点击又能继续的功能啦!

内容的提问来源于stack exchange,提问作者Mauricio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:38:47