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
相关产品推荐
相关产品推荐

