#python #tkinter
#python #tkinter
Вопрос:
Когда я запускаю это, он отображает процент только после завершения загрузки, так есть ли способ заставить его отображаться при загрузке?
listbox = Listbox(Admin)
listbox.grid(row=19, column=9)
def download0(runums, song):
chunks = 10000
dat = ''
runum = runums.replace(' ', ' ')
url = runum
down = urlopen(url)
downso = 0
tota = down.info().getheader('Content-Length').strip()
tota = int(tota)
while 1:
a = down.read(chunks)
downso = len(a)
if not a:
break
dat = a
percent = float(downso) / tota
percent = round(percent*100, 1)
sys.stdout.write(str(percent))
sys.stdout.flush()
sys.stdout.write("b"*4)
listbox.insert(END, percent)
Комментарии:
1. Обычно самый простой способ — поместить загрузчик в какой-либо поток или использовать некоторую загрузку на основе событий, основанную на select () (например, twisted ones), чтобы поддерживать цикл событий в рабочем состоянии.
Ответ №1:
Цикл событий Tkinter (запускаемый mainloop()
) выполняется в одном потоке. Он вращается, реагируя на события (например, щелчки мыши), перерисовывая виджеты и так далее. При нажатии кнопки для запуска загрузки управление передается вашей download0()
функции. Пока управление не вернется в цикл событий, никакие виджеты не будут перерисовываться, если вы не прикажете им.
Итак, во время загрузки вам нужно указать виджету перерисовать себя:
listbox.insert(END, percent)
listbox.update_idletasks()
Комментарии:
1. Вам определенно не следует использовать
update
. Вместо этого используйтеupdate_idletasks
. Почему?update
потенциально может реагировать на пользовательские события. Если эти пользовательские события снова вызовут эту же функцию, у вас возникнут проблемы.update_idletasks
безопасен, поскольку реагирует только на события «простоя», такие как перерисовка экрана.