Показывать ttk progressbar (python) при запуске функции - PullRequest
0 голосов
/ 04 октября 2018

У меня проблемы с моим кодом.То, что я пытаюсь сделать, это показать неопределенный индикатор выполнения ttk, в то время как функция ToDo() работает.Я искал в Интернете, и я нашел несколько сообщений, но в них люди запускают свою функцию с помощью кнопки tk, в то время как моя цель - запустить ее из-за пределов окна tk.Вот моя попытка, она выполняет мою функцию ToDo(), но не показывает индикатор выполнения.Нужно ли использовать threading?Если так, как я должен использовать это?Я новичок в питоне ...

try:
    import tkinter as tk
    from tkinter import ttk
except ImportError:
    import Tkinter as tk
    import ttk
import time

def ToDo():
    time.sleep(1)
    print("1 sec")
    time.sleep(1)
    print("2 sec")
    time.sleep(1)
    print("3 sec")
    time.sleep(1)
    print("4 sec")
    time.sleep(1)
    print("5 sec")
    global variable_check_final
    variable_check_final = True


class Application(tk.Frame):
    def __init__(self, main_window):
        # super().__init__(main_window)
        tk.Frame.__init__(self)
        main_window.title("Please wait")

        self.progressbar = ttk.Progressbar(self, mode="indeterminate")
        self.progressbar.pack()
        self.progressbar.place(x=30, y=60, width=200)
        self.place(width=200, height=200)
        main_window.geometry("300x200")
        self.progressbar.start()
        self.checkfinal()
        ToDo()


    def checkfinal(self):
        if variable_check_final == True:
            self.progressbar.stop()
            main_window.destroy()
        else:
            print("not yet")
            self.after(1000, self.checkfinal)



if __name__ == "__main__":
    print("started")
    global variable_check_final
    variable_check_final = False
    main_window = tk.Tk()
    app = Application(main_window)
    app.mainloop()

1 Ответ

0 голосов
/ 05 октября 2018

sleep остановит всю программу на требуемое время и не позволит вам обновить индикатор выполнения.Поэтому создайте функцию, которая содержит цикл while, который будет работать в течение необходимого вам времени, и обновите окно:

def Sleep(t, func):
    t1 = time.time()
    while time.time()-t1 < t:
        func()

t - это время, а func - это функция, которую вы дадите в качестве ввода, и онапобежит.Для обновления вы можете использовать как:

Sleep(1, main_window.update)

Вот полный рабочий код:

try:
    import tkinter as tk
    from tkinter import ttk
except ImportError:
    import Tkinter as tk
    import ttk
import time

def Sleep(t, func):
    t1 = time.time()
    while time.time()-t1 < t:
        func()
def ToDo():
    Sleep(1, main_window.update)
    print("1 sec")
    Sleep(1, main_window.update)
    print("2 sec")
    Sleep(1, main_window.update)
    print("3 sec")
    Sleep(1, main_window.update)
    print("4 sec")
    Sleep(1, main_window.update)
    print("5 sec")
    global variable_check_final
    variable_check_final = True


class Application(tk.Frame):
    def __init__(self, main_window):
        # super().__init__(main_window)
        tk.Frame.__init__(self)
        main_window.title("Please wait")
        self.progressbar = ttk.Progressbar(self, mode="indeterminate")
        self.progressbar.place(x=30, y=60, width=200)
        self.place(width=200, height=200)
        main_window.update()
        main_window.geometry("300x200")
        self.progressbar.start()
        self.checkfinal()
        ToDo()


    def checkfinal(self):
        if variable_check_final == True:
            self.progressbar.stop()
            main_window.destroy()
        else:
            print("not yet")
            self.after(1000, self.checkfinal)



if __name__ == "__main__":
    print("started")
    global variable_check_final
    variable_check_final = False
    main_window = tk.Tk()
    app = Application(main_window)
    app.mainloop()
...