我正在开发一个简单的Python程序,名为“Ilmiont DDNS Alerter”。正如标题所示,目的是让您知道动态IP地址何时发生变化。
通过咨询外部服务器来完成此操作。在Tkinter GUI中,用户可以选择时间频率来更新它。当他们启动更新程序时,我想安排更新功能按用户指定的每x分钟运行一次。我见过sched模块,但似乎只安排了一次。如何在停止之间的间隔内重复检查新IP?
我无法确定如何安排此操作。此外,当更新程序运行时,GUI在进程完成时无响应。这可能需要几秒钟,尤其是在慢速连接上。据推测,线程会克服这个问题吗?
答案 0 :(得分:2)
我认为这与您所寻找的类似,给出的答案也可能对您的问题有用。 Loop socket request every 5 seconds (Python)
答案表明你应该使用一个名为“after_idle”的tkinter模块来调度一个GUI不再忙的时候调用的函数。您也可以使用.after(time,function)在再次调用该函数之前延迟一段特定的时间。
祝你好运!答案 1 :(得分:1)
您有两种选择:
每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.如果你等待结果/沟通,应该没问题。
答案 2 :(得分:0)
您可以尝试Threading.Timer
参见此示例
from threading import Timer
def job_function():
Timer(60, job_function).start ()
print("Running job_funtion")
job_function()
每分钟会打印“Running job_function
”