我正在尝试从API获取JSON文件并将其保存在文件中。然后在Raspberry Pi UI上查看它。我的问题是,在更新JSON文件后,UI不会更新。
以下是代码:
while true:
time.sleep()
schedule.every().day.at("06:00").do(callinginit, 'It is 06:00')
我试过了:{{1}}(但问题是它没有第一次发布,必须等到早上6点)
答案 0 :(得分:1)
使用time.sleep()
或紧密的while循环会阻止GUI的执行(它不会更新)。
以下示例每interval
秒执行一段代码。
注释绑定允许您选择立即执行代码,然后等待interval
秒再次执行;默认设置是在interval seconds
之后执行。
如果您需要在给定时间执行,您可以修改它以首先计算从现在到该时间之间的时间长度,并使用interval
kwarg以秒为单位传递此值。
对于较长的时间间隔,您可以将root.after(5000, ...)
调整为xeq_every
每5秒调整一个更大的值,可能每10分钟或每小时调整一次,具体取决于按时运行的重要性。
它有目的地使用一个具有可变默认值的kwarg来利用闭包/ memoization(取决于你喜欢看它的方式)属性。
import tkinter as tk
import time
def xeq_every(event, interval=25, memo=[None]):
if memo[0] is None:
memo[0] = time.time() + interval
elif memo[0] > time.time():
print("waiting") # replace with `pass`
else:
print("=======>> executing")
memo[0] = time.time() + interval # set the time of the next execution
root.after(5000, xeq_every, 'dummy_event')
if __name__ == '__main__':
root = tk.Tk()
next_time = tk.IntVar()
next_time.set(f"will xeq at 25 seconds interval")
lbl = tk.Label(root, textvariable=next_time)
lbl.pack()
# root.bind('<Button-1>', lambda event, memo=[time.time()]: xeq_every(event, memo=memo))
root.bind('<Button-1>', xeq_every)
root.mainloop()
waiting
waiting
waiting
waiting
=======>> executing
waiting
waiting
waiting
waiting
=======>> executing
waiting
waiting
waiting
waiting
=======>> executing