更新Tkinter列表框的更好方法

2024-09-28 22:37:40 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨 因此,首先我做了一个程序,可以下载音乐并在列表框中显示下载的百分比。在

有点像这样

    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窗口上显示百分比? 请帮忙

更新你的idletasks doessent工作


Tags: fromimport程序admintkinterbuttonpackend
2条回答

我用的是ttk.进度条,您只需将一个变量与其关联并更新该特定变量。在

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

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

显示字符串的适当小部件是Label。{1>可以在运行时使用文本更改方法:

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

第二,创建两个根窗口-admin和{}。奇怪的是,你把列表框放在一个里,按钮放在另一个里。Tk并不是设计成那样工作的。第三,需要调用根窗口的mainloop方法(例如:Admin.mainloop

最后,对于您的评论update_idletasks不起作用,请定义为“不起作用”。它实际上会更新显示。它不会让你在窗口运行时与它交互。在

我根据上面的注释对代码进行了修改(只创建了一个根,使用了Label而不是Listbox,并使用了update_idletasks,程序运行到完成,下载了这首歌。在

调用update的危险在于:如果在下载时单击“下载”按钮会怎样?下一次调用update时,该按钮将被服务。在该事件的服务中,您将进入一个无限循环。当内部无限循环运行时,外部循环无法运行。您将有效地冻结了第一次下载。在

正确的解决方案包括(至少)两种技术中的一种。第一,创建一个线程来进行下载,并让它定期将信息发送回主循环,以便它可以更新进度条。第二种方法是利用已经存在的无限循环event loop,通过使用after将作业放入事件队列中,一次读取一个块。在

互联网上有两种方法的例子。在

相关问题 更多 >