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

#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 безопасен, поскольку реагирует только на события «простоя», такие как перерисовка экрана.