Python 每x分钟重复运行一次任务

Python 每x分钟重复运行一次任务,python,multithreading,networking,tkinter,schedule,Python,Multithreading,Networking,Tkinter,Schedule,我正在开发一个简单的Python程序,名为“Ilmiont DDNS Alerter”。正如标题所示,目的是让您知道动态IP地址何时更改 它通过咨询外部服务器来实现这一点。在Tkinter GUI中,用户可以选择时间频率进行更新。当他们启动更新程序时,我希望按照用户的指定,将更新函数安排为每x分钟运行一次。我看过sched模块,但它似乎只安排了一次。如何使其在间隔期间重复检查新IP,直到停止 我很难想出如何安排这件事。此外,当更新程序运行时,GUI将在流程完成时失去响应。这可能需要几秒钟,尤其是

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

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


我很难想出如何安排这件事。此外,当更新程序运行时,GUI将在流程完成时失去响应。这可能需要几秒钟,尤其是在连接速度较慢的情况下。大概线程将克服这个问题?

我认为这与您所寻找的类似,给出的答案可能也适用于您的问题

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


祝你好运

我认为这与您正在寻找的类似,给出的答案也可能适用于您的问题

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


祝你好运

我认为这与您正在寻找的类似,给出的答案也可能适用于您的问题

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


祝你好运

我认为这与您正在寻找的类似,给出的答案也可能适用于您的问题

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


祝你好运

您实际上有两种选择:

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

  • 或者安排函数在上次完成后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()
    
    因此,点击“开始”,它将每两秒打印一次时间,另外一个函数将在这两秒之间运行。您可以在任何时候点击“活动”,以证明界面响应良好。我希望这有帮助?如果您真的反对函数本身调用,那么您可能会启动一个线程,该线程只运行一个无限循环,向队列中添加事件,但这似乎是一个不必要的复杂问题


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

    你有两个选择:

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

  • 或者安排函数在上次完成后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()
    
    因此,点击“开始”,它将每两秒打印一次时间,另外一个函数将在这两秒之间运行。您可以在任何时候点击“活动”,以证明界面响应良好。我希望这有帮助?如果您真的反对函数本身调用,那么您可能会启动一个线程,该线程只运行一个无限循环,向队列中添加事件,但这似乎是一个不必要的复杂问题


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

    你有两个选择:

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

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

  • 在任何一种情况下,您的
    cancel
    按钮只会在某个地方设置一个标志,运行的函数应该在第一次操作时进行检查

    第一种情况的最大缺点是它会锁定其他代码的执行。更简单的方法肯定是在函数运行后自行安排。如果您的其他代码需要很长时间,线程无疑是您可以研究的一个选项;我自己不必使用它,但是应该使用类似于下面代码的东西