python-3.x - Gtk python添加更改超时
问题描述
我正在尝试使用 Gtk 超时(在 python3 中)实现番茄钟计时器。我最近的方法是调用超时GLib.timeout_add_seconds(25*60, self.pomodoro)
,在 pomodoro 函数中,它启动一个新的计时器(中断)GLib.timeout_add_seconds(5*60, self.prompt_timeout)
并且 pomodoro 函数返回 False(停止原来的计时器)。prompt_timeout 为另一个番茄时间设置一个计时器,等等。这个想法是函数设置计时器以相互调用,在休息和番茄时间之间交替。但这并不像我预期的那样工作。奇怪的事情发生了,超时一次多次调用同一个函数,而超时在不应该发生的时候随机发生。谁能解释为什么?有没有更好的方法来做到这一点?我正在使用 gi.repository。
from gi.repository import GLib
class TaskNotify:
def __init__(self):
self.count = 1
self.pomodoro_length = 25
self.prompt_timeout()
GLib.timeout_add_seconds(self.pomodoro_length*60, self.pomodoro)
def pomodoro(self):
time = 15 if self.count % 4 == 0 else 5
self.count += 1
GLib.timeout_add_seconds(time*60, self.prompt_timeout)
return False
def prompt_timeout(self):
GLib.timeout_add_seconds(self.pomodoro_length*60, self.pomodoro)
return False
if __name__ == '__main__':
tasks = TaskNotify()
GLib.MainLoop().run()
解决方案
在创建 MCVE 时,我发现我犯了一个愚蠢的错误。在 init 中,我调用了 self.prompt_timeout(),它在 self.pomodoro 上启动了一个计时器,然后在 init 中我在 self.pomodoro 上创建了另一个计时器。因此,奇数间隔的重复计时器是由于错误地创建了多个计时器造成的。
所以,工作版本:
from gi.repository import GLib
class TaskNotify:
def __init__(self):
self.count = 1
self.pomodoro_length = 25
self.prompt_timeout()
def pomodoro(self):
time = 15 if self.count % 4 == 0 else 5
self.count += 1
GLib.timeout_add_seconds(time*60, self.prompt_timeout)
return False
def prompt_timeout(self):
GLib.timeout_add_seconds(self.pomodoro_length*60, self.pomodoro)
return False
if __name__ == '__main__':
tasks = TaskNotify()
GLib.MainLoop().run()
推荐阅读
- visual-studio - 无法在具有 Anaconda 环境的 VS Code 中为 Plotly Dash 运行本地服务器
- python - 使用 librosa 理解 STFT
- javascript - 无法在谷歌应用脚本表中使用类方法
- json - 如何使用 react-router-dom 创建动态路由?
- python-3.x - 尝试在框架上添加滚动条时出现问题
- javascript - Orderby 不使用 Microsoft Graph API
- ios - 如何使用硬件键盘在 iOS 模拟器中键入 @?
- logistic-regression - 如何估计累积链接混合模型中的整体截距?
- swift - 无法将类型 '(() throws -> Void?) -> ()' 的值转换为预期的参数类型 '((Void) throws -> Void)?
- ios - 一旦 13 位时间戳保存在 firebase 中,如何在 Xcode 中获取并转换为日期?