Когда я запускаю это, он отображает процент после загрузки, поэтому есть способ сделать его отображаемым, когда он загрузит его?
listbox = Listbox(Admin)
listbox.grid(row=19, column=9)
def download0(runums, song):
chunks = 10000
dat = ''
runum = runums.replace(' ', '%20')
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)
Цикл событий Tkinter (запущенный mainloop()
) выполняется в одном потоке. Он вращается, реагирует на события (например, щелчки мыши), перерисовывает виджеты и т.д. При нажатии кнопки, чтобы начать загрузку, управление передается вашей функции download0()
. Пока управление не вернется в цикл событий, никакие виджеты не будут перерисовываться, если вы не сообщите им.
Итак, пока загрузка выполняется, вам нужно сказать, что виджет будет перерисовываться:
listbox.insert(END, percent)
listbox.update_idletasks()
update
. Вместо этого используйте update_idletasks
. Почему? update
потенциально может отвечать на пользовательские события. Если эти пользовательские события вызовут эту же функцию снова, у вас будут проблемы. update_idletasks
безопасен, потому что он реагирует только на «неактивные» события, такие как перерисовка экрана.