一定时间后自动刷新Python脚本

时间:2018-09-03 17:51:32

标签: python tkinter raspberry-pi refresh

我有一个脚本,该脚本从网站上提取火车的出发时间,并将该时间与datetime之间的时差保存在一个名为resp的变量中。 响应包含到下一趟火车出发的时间。

然后使用Tkinter创建一个新窗口:

version: '2'
services:
    db:
    image: mysql
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: symfony
        MYSQL_USER: symfony
        MYSQL_PASSWORD: symfony
    php:
        build: ./php-fpm
        expose:
            - "9000"
        volumes:
            - ./symfony:/var/www/symfony
            - ./logs/symfony:/var/www/symfony/var/logs
        links:
            - db
    nginx:
        build: ./nginx
        ports:
            - "80:80"
        links:
            - php
        volumes_from:
            - php
        volumes:
            - ./logs/nginx/:/var/log/nginx
    elk:
        image: willdurand/elk
        ports:
            - "81:80"
        volumes:
            - ./elk/logstash:/etc/logstash
            - ./elk/logstash/patterns:/opt/logstash/patterns
        volumes_from:
            - php
            - nginx

并在该窗口中显示resp。

我的问题是出发时间(resp)应该始终是最新的,这意味着它必须每秒刷新一次resp(这意味着它必须运行该问题中未包含的代码)。 / p>

在一段时间内将整个脚本包括为True:是行不通的,并且可能不是有效的方式。

有没有办法做到这一点?

我的代码: https://drive.google.com/open?id=1romGOeUqKa2B-fKQyily6DXDqZTY9xMf

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

Tkinter提供了一种名为after的方法,可让您安排将来要运行的工作。如果要执行的工作可以在几百毫秒内执行,则可以使用它代替诸如多线程或多处理之类的更复杂的事情。

窗口小部件具有名为configure的方法,该方法可让您在创建窗口小部件后更改其属性。您可以使用此方法更改窗口小部件中显示的数据。

例如,假设您有一个名为get_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_display以使用存储在变量中或队列中的任何内容更新变量。