python - 一段时间后自动刷新 Python 脚本
问题描述
我有一个脚本,它从网站获取火车出发时间,并将该时间和 datetime.now 之间的差异保存在一个名为 resp 的变量中。Resp 包含直到下一趟火车出发的时间。
然后它使用 Tkinter 创建一个新窗口:
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text=resp)
label.grid(row=1, column=1)
self.grid_rowconfigure(1, weight=1)
self.grid_columnconfigure(1, weight=1)
if __name__ == "__main__":
root = tk.Tk()
Example(root).grid(sticky="nsew")
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
root.geometry('1920x1080')
root.mainloop()
并在该窗口中显示相应的。
我的问题是出发时间(resp)应该始终是最新的,这意味着它必须每秒刷新 resp(这意味着它必须运行此问题中未包含的代码)。
在一段时间内包含整个脚本 True: 不起作用,并且可能不是一种有效的方法。
有没有办法做到这一点?
我的代码: https ://drive.google.com/open?id=1romGOeUqKa2B-fKQyily6DXDqZTY9xMf
解决方案
Tkinter 提供了一个名为的方法after
,可以让您安排将来运行的工作。如果要执行的工作可以在几百毫秒内执行,您可以使用它来代替更复杂的东西,如多线程或多处理。
小部件有一个名为 的方法configure
,它允许您在创建小部件后更改它的属性。您可以使用此方法更改小部件中显示的数据。
例如,假设您有一个名为get_resp
. 也许它调用了一个休息服务,也许它读取了一个文件,这并不重要。例如,如果你想调用这个函数并每 10 秒更新一次显示,你可以这样做:
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.label = tk.Label(self, text=resp)
...
def refresh_display(self):
# get the new value
resp = self.get_resp()
# update the display with the new value
self.label.configure(text=resp)
# have this function be called again in 10 seconds
self.after(10000, self.refresh_display)
如果self.get_resp()
花费的时间太长,另一种选择是创建一个线程,该线程调用self.get_resp()
然后设置一个具有新值的变量(或将其推送到线程安全队列中)。然后,您可以修改refresh_display
以使用存储在变量中的任何内容或队列中的任何内容来更新变量。
推荐阅读
- laravel-7 - 如何删除电子邮件地址中的姓名
- node.js - 如何从 mongoDB 集合中的数组中删除一行
- c# - 如何使用 C# 播放 PC 扬声器的音高
- python - 如何在python中使列表的第一个元素不变?
- c# - 有没有一种优雅的方法可以将正数转换为+1,将负数转换为-1?
- reactjs - 反应构建失败:无法读取未定义的属性“名称”
- c# - 寻找更好的方法来获取所有数据类型并准备一种数据类型作为键和过滤器列表作为值的字典
- python - 在 sympy 中将浮点数转换为整数
- excel - VBA 工作簿另存为
- vba - 在 MS Word 中将文本注释转换为尾注的宏