Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Gtk python添加更改超时_Python 3.x_Gtk - Fatal编程技术网

Python 3.x Gtk python添加更改超时

Python 3.x Gtk python添加更改超时,python-3.x,gtk,Python 3.x,Gtk,我正在尝试使用Gtk超时(在python3中)实现一个pomodoro计时器。我最近的方法是调用一个timeoutGLib.timeout\u add\u seconds(25*60,self.pomotoro),在pomotoro函数中,它启动一个新的计时器(break)GLib.timeout\u add\u seconds(5*60,self.prompt\u timeout),pomotoro函数返回False(停止原来的计时器)。和prompt_timeout为另一个pomodoro设

我正在尝试使用Gtk超时(在python3中)实现一个pomodoro计时器。我最近的方法是调用一个timeout
GLib.timeout\u add\u seconds(25*60,self.pomotoro)
,在pomotoro函数中,它启动一个新的计时器(break)
GLib.timeout\u add\u seconds(5*60,self.prompt\u timeout)
,pomotoro函数返回False(停止原来的计时器)。和prompt_timeout为另一个pomodoro设置计时器,等等。其思想是函数设置计时器,以便在中断和pomodoro之间交替调用。 但这不是我想要的。奇怪的事情发生了,超时一次调用同一个函数多次,而超时在不应该的时候随机发生。有人能解释一下原因吗?还有更好的方法吗? 我正在使用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()

MCVE是最好的选择。等我有机会的时候再发一封。同时,我指的来源是: