Tkinter: ProgressBar с неопределенной продолжительностью

Я хотел бы реализовать индикатор выполнения в Tkinter, который удовлетворяет следующим требованиям:

  • Индикатор выполнения – это единственный элемент в главном окне
  • Его можно запустить с помощью команды запуска без необходимости нажатия любой кнопки
  • Он может дождаться завершения задания с неизвестной продолжительностью
  • Индикатор индикатора выполнения продолжает двигаться, пока задача не завершена
  • Он может быть закрыт командой останова без необходимости нажатия любой стоповой панели

До сих пор у меня есть следующий код:

import Tkinter import ttk import time def task(root): root.mainloop() root = Tkinter.Tk() ft = ttk.Frame() ft.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP) pb_hD = ttk.Progressbar(ft, orient='horizontal', mode='indeterminate') pb_hD.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP) pb_hD.start(50) root.after(0,task(root)) time.sleep(5) # to be replaced by process of unknown duration root.destroy() 

Здесь проблема заключается в том, что индикатор выполнения не останавливается после завершения 5 секунд.

Может ли кто-нибудь помочь мне найти ошибку?

  • Создайте новый виджет ttk от tkinter
  • Python: отображение Dict of Dicts с использованием дерева пользовательского интерфейса для ключей и любого другого виджета для значений
  • Установите значение по умолчанию для ttk Combobox
  • Выравнивание вкладок справа налево с помощью виджета ttk.Notebook
  • Как изменить цвет кнопки ttk
  • Как отключить ручное изменение размера столбца дерева Tkinter?
  • Как изменить цвет ttk.progressBar в python
  • Изменение цвета текста виджета ttk
  • One Solution collect form web for “Tkinter: ProgressBar с неопределенной продолжительностью”

    Когда mainluop активен, сценарий не переместится на следующую строку до тех пор, пока корень не будет уничтожен. Могут быть другие способы сделать это, но я бы предпочел сделать это с помощью потоков.

    Что-то вроде этого,

     import Tkinter import ttk import time import threading #Define your Progress Bar function, def task(root): ft = ttk.Frame() ft.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP) pb_hD = ttk.Progressbar(ft, orient='horizontal', mode='indeterminate') pb_hD.pack(expand=True, fill=Tkinter.BOTH, side=Tkinter.TOP) pb_hD.start(50) root.mainloop() # Define the process of unknown duration with root as one of the input And once done, add root.quit() at the end. def process_of_unknown_duration(root): time.sleep(5) print 'Done' root.destroy() # Now define our Main Functions, which will first define root, then call for call for "task(root)" --- that's your progressbar, and then call for thread1 simultaneously which will execute your process_of_unknown_duration and at the end destroy/quit the root. def Main(): root = Tkinter.Tk() t1=threading.Thread(target=process_of_unknown_duration, args=(root,)) t1.start() task(root) # This will block while the mainloop runs t1.join() #Now just run the functions by calling our Main() function, if __name__ == '__main__': Main() 

    Дайте мне знать, если это поможет.

    Python - лучший язык программирования в мире.