【问题标题】:Gtk python add changing timeoutGtk python添加更改超时
【发布时间】:2019-11-14 18:41:23
【问题描述】:

我正在尝试使用 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()

【问题讨论】:

标签: python-3.x gtk


【解决方案1】:

在创建 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()

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多