лучший способ обновить список Tkinter - PullRequest
0 голосов
/ 10 мая 2011

Привет поэтому прежде всего я создал программу, которая загружает музыку и отображает процент загруженных файлов в списке.

вроде как

    from Tkinter import *
from urllib2 import *
admin = Tk()
Admin = Tk()

listbox = Listbox(admin, bg="PURPLE")
listbox.pack()

def fores():
    chunks = 10000
    dat = ''
    song = '3 rounds and a sound'
    url = 'http://bonton.sweetdarkness.net/music/Blind%20Pilot%20--%203%20Rounds%20and%20A%20Sound.mp3'
    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)



        listbox.insert(END, percent)
        listbox.update()
        listbox.delete(0, END)
        listbox.insert(END, percent)
        listbox.update()






button = Button(Admin, text='Download', command=fores)
button.pack()
button = Button(Admin, text='Download', command=fores)
button.pack()
mainloop()

Я не покажу вам оригинальную программу, так как она выходит за пределы размера сообщения.

В моей исходной программе, если я перемещаю окно перед тем, как загрузить mp3-файл, оно загружается менее чем на 3% и останавливается, а если я затем закрываю окно, начинается загрузка снова.

Кто-нибудь знает, почему это так или есть альтернатива отображению процента в окне Tkinter? Пожалуйста, помогите

и update_idletasks делают работу

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Правильный виджет для отображения строки - Метка .Вы можете изменить текст во время выполнения с помощью метода configure:

self.progress = Label(...)
...
self.progress.configure(text="%s%% completed" % percent)

Во-вторых, вы создаете два корневых окна - admin и Admin.И как ни странно, вы кладете список в одну, а кнопки в другую.Тк не предназначен для такой работы.В-третьих, вам нужно вызвать метод mainloop вашего (единственного) корневого окна (например: Admin.mainloop)

Наконец, что касается вашего комментария о том, что update_idletasks не работает - пожалуйста, определите «hasn»т работа ".Это фактически обновит дисплей.Чего он не сделает, так это позволит вам взаимодействовать с окном во время его работы.

Я внес изменения в ваш код на основе приведенных выше комментариев (создал только один корень, использовал Label вместо Listbox и использовал update_idletasks, и программа запускалась до конца, загружая песню.

Опасность вызова update заключается в следующем: что, если вы нажмете кнопку «скачать», когда уже загружаете?произойдет в следующий раз, когда будет вызван update, нажатие этой кнопки будет обслужено. При обслуживании этого события вы войдете в бесконечный цикл. Пока этот внутренний бесконечный цикл работает, внешний не может работать.первая загрузка.

Надлежащее решение включает в себя один из (по крайней мере) двух методов: один - создать поток для загрузки и периодически отправлять информацию обратно в основной цикл, чтобы он мог обновлять ход выполнения.Во-вторых, использовать уже существующий бесконечный цикл - цикл обработки событий - и выполнять чтение фрагментов однимодновременно помещая задания в очередь событий с after.

В Интернете есть примеры обоих подходов.

0 голосов
/ 11 мая 2011

Я использую ttk.Progressbar, все, что вам нужно сделать, это связать переменную с ней и обновить эту конкретную переменную.

http://docs.python.org/library/ttk.html#progressbar

http://www.tkdocs.com/tutorial/morewidgets.html#progressbar

...