Обновление списка

1

Когда я запускаю это, он отображает процент после загрузки, поэтому есть способ сделать его отображаемым, когда он загрузит его?

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)
  • 0
    Самый простой способ - это поместить загрузчик в какой-либо поток или использовать загрузку на основе событий, основанную на select () (например, на скрученных), чтобы поддерживать цикл событий.
Теги:
tkinter

1 ответ

1
Лучший ответ

Цикл событий Tkinter (запущенный mainloop()) выполняется в одном потоке. Он вращается, реагирует на события (например, щелчки мыши), перерисовывает виджеты и т.д. При нажатии кнопки, чтобы начать загрузку, управление передается вашей функции download0(). Пока управление не вернется в цикл событий, никакие виджеты не будут перерисовываться, если вы не сообщите им.

Итак, пока загрузка выполняется, вам нужно сказать, что виджет будет перерисовываться:

listbox.insert(END, percent)
listbox.update_idletasks()
  • 0
    Вы определенно не должны использовать update . Вместо этого используйте update_idletasks . Почему? update потенциально может отвечать на пользовательские события. Если эти пользовательские события вызовут эту же функцию снова, у вас будут проблемы. update_idletasks безопасен, потому что он реагирует только на «неактивные» события, такие как перерисовка экрана.
  • 0
    Хороший вопрос @bryan, изменил его на widget.update_idletasks.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню