TKInter:在特定时间在UI上更新标签

时间:2018-06-14 12:15:28

标签: python-3.x tkinter

我正在尝试从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点)

1 个答案:

答案 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