每隔x分钟重复运行任务

2024-05-16 19:15:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个简单的Python程序,名为“Ilmiont DDNS Alerter”。正如标题所示,其目的是让您知道动态IP地址何时更改。在

它通过咨询外部服务器来实现这一点。在Tkinter GUI中,用户可以选择一个时间频率来更新它。当他们启动更新程序时,我希望按照用户的指定,将更新函数安排为每x分钟运行一次。我看过sched模块,但它似乎只安排了一次。如何让它在间隔时间内重复检查新IP,直到停止?在

我不知道该怎么安排。另外,当更新程序运行时,当进程完成时,GUI没有响应。这可能需要几秒钟的时间,尤其是在连接速度慢的情况下。也许线程可以克服这个问题?在


Tags: 函数用户程序目的服务器标题tkinter时间
3条回答

你有两个选择:

  1. 每5(或x)分钟运行一次以添加到计划中的循环

  2. 或者安排函数在上次完成后x分钟再次运行。

在这两种情况下,cancel按钮只会在某个地方设置一个标志,运行中的函数应该检查它作为第一个操作。在

第一种情况最大的缺点是它会锁定其他代码的执行。更简单的方法是让函数在运行后自行调度。如果您的其他代码花费了很长时间,那么线程化绝对是您可以研究的一个选项;我不必亲自使用它,但是类似于下面代码的代码应该可以工作:

import threading
import tkinter
import time


class RepeatExecute(object):
    def __init__(self,master,t=2000):
        self.master=master
        self.time=t

    def go(self):
        self.GO = True
        self.call_self()

    def call_self(self):
        if self.GO is True:
            t = self.time
            print(time.time())
            thrd = threading.Thread(target=self.slow_execute)
            thrd.start()
            self.master.after(t,self.call_self)

    def set_time(self,t):
        self.time=t

    def stop(self):
        self.GO = False

    def slow_execute(self):
        time.sleep(1.0)
        if self.GO is True:
            print('Halfway')

    def active(self):
        print('Active')


if __name__=='__main__':
    root =tkinter.Tk()
    RE = RepeatExecute(root,t=2000)
    btn1 = tkinter.Button(root,text='Start',command=RE.go)
    btn1.grid()
    btn2 = tkinter.Button(root,text='Stop',command=RE.stop)
    btn2.grid()
    btn3 = tkinter.Button(root,text='ACTIVE!',command=RE.active)
    btn3.grid()
    root.mainloop()

所以点击“Start”,它会每隔两秒打印一次时间,另外还有一个函数会在这期间运行。你可以在任何时候点击“ACTIVE”来证明接口是响应的。我希望这对你有帮助?如果你真的反对函数本身的调用,你可以启动一个线程,它只运行一个无限循环,向队列中添加事件,但这似乎是一个不必要的复杂问题。在

我确实注意到,如果slow_execute函数执行大量的数字运算,那么线程并不是最好的选择,线程主要用于由于全局解释器锁的作用而导致的慢I/O。如果你在等待结果/沟通,应该没问题。在

你可以试试Threading.Timer

看这个例子

from threading import Timer

def job_function():
    Timer(60, job_function).start ()
    print("Running job_funtion")
job_function()

它每分钟都会打印“Running job_function

我认为这与你所要寻找的相似,给出的答案可能也适用于你的问题。Loop socket request every 5 seconds (Python)

答案表明,您应该使用一个名为“after峎idle”的tkinter模块,该模块会在GUI不再忙时调度调用的函数。也可以使用.after(time,function)在再次调用函数之前延迟一段特定的时间。在

祝你好运!在

相关问题 更多 >