在特定时间后自动刷新Python脚本

在特定时间后自动刷新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

我有一个脚本,它从一个网站获取火车出发时间,并将时间和日期时间之间的差异保存在一个名为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)应该始终是最新的,这意味着它必须每秒刷新resp(这意味着它必须运行此问题中未包含的代码)

在一段时间内包含整个脚本是正确的:不起作用,可能不是一种有效的方法

有没有办法做到这一点

我的代码:
您需要使用多线程。一个单独的线程可以每秒刷新
resp
,而您的主线程处理显示
resp

Tkinter提供了一个名为
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部分之外,它也不起作用。如果你需要查看代码,我在我的回答中包含了一个链接。我现在已经设法让它在一个新窗口中显示我的响应,并在你的回答中包含代码,但它仍然不会自动刷新。