在特定时间后自动刷新Python脚本
我有一个脚本,它从一个网站获取火车出发时间,并将时间和日期时间之间的差异保存在一个名为resp的变量中。 Resp包含下一列列车发车前的时间 然后使用Tkinter创建一个新窗口:在特定时间后自动刷新Python脚本,python,tkinter,raspberry-pi,refresh,Python,Tkinter,Raspberry Pi,Refresh,我有一个脚本,它从一个网站获取火车出发时间,并将时间和日期时间之间的差异保存在一个名为resp的变量中。 Resp包含下一列列车发车前的时间 然后使用Tkinter创建一个新窗口: class Example(tk.Frame): def __init__(self, parent): tk.Frame.__init__(self, parent) label = tk.Label(self, text=resp) label.grid(r
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)应该始终是最新的,这意味着它必须每秒刷新resp(这意味着它必须运行此问题中未包含的代码)
在一段时间内包含整个脚本是正确的:不起作用,可能不是一种有效的方法
有没有办法做到这一点
我的代码:
您需要使用多线程。一个单独的线程可以每秒刷新
resp
,而您的主线程处理显示respTkinter提供了一个名为after
的方法,允许您计划将来运行的工作。如果要执行的工作可以在几百毫秒内执行,那么可以使用它来代替更复杂的多线程或多处理
小部件有一个名为configure
的方法,它允许您在创建小部件后更改其属性。您可以使用此方法更改小部件中显示的数据
例如,假设您有一个名为get\u resp
的函数。也许它调用rest服务,也许它读取文件,这其实并不重要。例如,如果要调用此函数并每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\u display
以使用变量中存储的内容或队列中的内容更新变量 多线程只是解决此问题的至少三种方法之一。我认为“你需要使用多线程”这个词有点太强了。除了你在回答中提到的多线程和“Tkinter.after”之外,第三种方法是什么?你可以使用一种形式的多处理。我现在研究了多线程,并尝试在我的代码中实现它。我创建了一个从网站上获取时间的线程,然后计算下一班火车发车前的时间(resp)。我创建了另一个线程,它运行问题中包含的Tkinter代码。然后我用t.start和t2.start启动了两个线程。它抛出了一些错误,一个是名称“resp”未定义。你知道为什么会发生这种情况吗?你能不能在回答中加入一些示例代码,说明如何在我的示例中使用多线程?我试图在代码中实现这一点,但没有成功。首先,我只是将你的代码复制粘贴到我的代码中,运行之后,它像往常一样创建了一个窗口,但没有更新。然后,我将所有代码都打包在一个名为get_resp的def中,除了tkinter部分之外,它也不起作用。如果你需要查看代码,我在我的回答中包含了一个链接。我现在已经设法让它在一个新窗口中显示我的响应,并在你的回答中包含代码,但它仍然不会自动刷新。