Скрипт Python запускается через x секунд, но когда вставлен код tkinter, он запускается только один раз - PullRequest
1 голос
/ 21 марта 2019

Каков наилучший способ повторного выполнения функции каждые x секунд в Python?

Я пробовал решения, размещенные по ссылкам выше, но ни одна из них не помогла мне достичь желаемого результата.

код, приведенный выше, печатает «Doing stuff ...» на консоли много раз за указанные секунды, т.е. 5, но когда я добавляю строку window (), которая является кодом tkinter для отображения сообщения, код запускается только один раз, а не в любое время снова.

пожалуйста, помогите. я хочу снова и снова запускать код tkinter в определенное время в соответствии с системными часами, но сейчас я просто пытаюсь выполнить его через x секунд.

любая помощь действительно будет много значить для меня. Спасибо

Ответы [ 2 ]

1 голос
/ 21 марта 2019

поиск метода tkinter .after.

Это позволит вам запускать команду каждые x секунд.

Проблема, с которой ваш код tkinter запускается только один раз, заключается в том, что сначала он устанавливается, а затем переходит в цикл (root.mainloop ()), поэтому никогда не возвращается к вашему коду, чтобы что-то снова отобразить.

Пример: tkinter: как использовать после метода

0 голосов
/ 21 марта 2019

Я думаю, что вам нужны поток и очередь ... позвольте мне показать небольшое демо.

Я установил time.sleep (1) в секундах в классе thead.

В этом случае вы получаете два преимущества: сначала повторяйте свою функцию в любое время

Вы желаете, и вторая ваша программа никогда не замораживает себя.

import tkinter as tk
import threading
import queue
import datetime
import time

class MyThread(threading.Thread):

    def __init__(self, queue,):
        threading.Thread.__init__(self)

        self.queue = queue
        self.check = True

    def stop(self):
        self.check = False

    def run(self):


        while self.check:
            x = "Doing stuff.. "
            y = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            msg = x+y
            time.sleep(1)
            self.queue.put(msg)


class App(tk.Frame):

    def __init__(self,):

        super().__init__()

        self.master.title("Hello World")
        self.master.protocol("WM_DELETE_WINDOW",self.on_close)

        self.queue = queue.Queue()

        self.my_thread = None

        self.init_ui()

    def init_ui(self):

        self.f = tk.Frame()

        w = tk.Frame()

        tk.Button(w, text="Start", command=self.launch_thread).pack()
        tk.Button(w, text="Stop", command=self.stop_thread).pack()
        tk.Button(w, text="Close", command=self.on_close).pack()

        w.pack(side=tk.RIGHT, fill=tk.BOTH, expand=0)
        self.f.pack(side=tk.LEFT, fill=tk.BOTH, expand=0)

    def launch_thread(self):

        if (threading.active_count()!=0):

            self.my_thread = MyThread(self.queue)
            self.my_thread.start()
            self.periodiccall()

    def stop_thread(self):

     if(threading.active_count()!=1):
         self.my_thread.stop()


    def periodiccall(self):

        self.checkqueue()
        if self.my_thread.is_alive():
            self.after(1, self.periodiccall)
        else:
            pass

    def checkqueue(self):
        while self.queue.qsize():
            try:
                ret = self.queue.get(0)
                msg = "%s"%(ret)
                print(msg)
            except queue.Empty:
                pass                    

    def on_close(self):
        if(threading.active_count()!=1):
            self.my_thread.stop()

        self.master.destroy()

if __name__ == '__main__':
    app = App()
    app.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...