Автоматическое обновление скрипта Python через определенное время - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть скрипт, который берет время отправления поездов с веб-сайта и сохраняет разницу между этим временем и 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()

и отображает соответственно в этом окне.

Моя проблема в том, что время отправления (соответственно) всегда должно быть актуальным, что означает, что оно должно обновлять респ (что означает, что ему придется запускать код, который не включен в этот вопрос) каждую секунду.

Включение всего сценария через некоторое время True: не работает и, вероятно, не будет эффективным способом сделать это.

Есть ли способ сделать это?

Мой код: https://drive.google.com/open?id=1romGOeUqKa2B-fKQyily6DXDqZTY9xMf

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

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, чтобы обновить переменную с тем, что хранится в переменной или что-то в очереди.

0 голосов
/ 03 сентября 2018

Вам нужно использовать многопоточность. Отдельный поток может обновлять resp каждую секунду, в то время как ваш основной поток обрабатывает отображение resp.

...