2016-11-21 3 views
3

Я хочу индикатор выполнения, который показывает пользователю процесс загрузки. При обновлении GUI и загрузке в то же время индикатор прогресса замирает, и я понимаю, почему, но я не знаю, как его решить. Я пробовал многопоточность, используя этот пост: Tkinter: How to use threads to preventing main event loop from “freezing” и используя The Basics of Python Multithreading and Queues в качестве руководства, чтобы помочь мне подогнать его под мои нужды. Проблема в том, каким образом я пытаюсь достичь своей цели, я всегда, кажется, ошибаюсь, меняя ее, чтобы делать то, что мне нужно.ttk progress bar freezing

Самых основная версия моего кода (без многопоточности):

from Tkinter import * 
import ttk 
from urllib import URLopener # Downloading files 

# Make frame to tell user what file is getting downloaded 
self.Progressmsg = Label(self, text="TempValue") 
self.Progressmsg.pack(pady=(10,0)) 

# Make progress bar to show user download progress 
self.Progressbar = ttk.Progressbar(self, mode="determinate", orient='horizontal', lengt=280, maximum=len(self.AllClasses)) 
self.Progressbar.pack(padx=10, pady=10) 
self.Progressbar["value"] = 0 

def DownloadFile(Class): 
    # Update progress message 
    self.Progressmsg["text"] = "Downloading {0}.ics...".format(Class) 

    # Download each file from saxion website 
    CalFile = URLopener() 
    CalFile.retrieve("http://[school website]/ical/group/{0}.ics".format(Class), "Data/{0}.ics".format(Class)) 

    # Update progress bar 
    self.Progressbar["value"] += 1 

for Study in self.Parameters["Classes"]: 
    for Class in Study: 
     DownloadFile(Class) 

Примечание: В этом коде AllClasses список различных классов, из которых календарного файл должен быть загружен.
Сам код является частью довольно большого класса, который я не включил. Вот почему я использую self. [Variablename]

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

ответ

3

Попробуйте это:

# Update progress bar 
self.Progressbar["value"] += 1 
self.Progressbar.update_idletasks() 

Если он не работает, то используйте вместо self.Progressbar.update().

Графический интерфейс не отражает ваши изменения, если есть что-то еще (например, загрузка следующего файла), если вы не вызываете update_idletasks() или update().