Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表框更新_Python_Tkinter - Fatal编程技术网

Python 列表框更新

Python 列表框更新,python,tkinter,Python,Tkinter,当我运行这个程序时,它只在下载完成后显示百分比,那么有没有办法让它在下载时显示出来 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

当我运行这个程序时,它只在下载完成后显示百分比,那么有没有办法让它在下载时显示出来

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()
Tkinter事件循环(由
mainloop()
启动)在单个线程上运行。它会旋转,对事件(如鼠标点击)做出反应,重新绘制小部件,等等。单击按钮开始下载时,控件将传递给
download0()
函数。在控件返回到事件循环之前,除非您告诉小部件,否则它们不会重新绘制

因此,在下载过程中,您需要告诉小部件重新绘制自己:

listbox.insert(END, percent)
listbox.update_idletasks()

最简单的方法通常是将下载程序放在某个线程中,或使用基于select()的一些基于事件的下载(例如扭曲的)来保持事件循环的活动状态。最简单的方法通常是将下载程序放在某个线程中,或使用基于select()的一些基于事件的下载(例如扭曲的)要使事件循环保持活动状态,您绝对不应该使用
update
。相反,请使用
update\u idletasks
。为什么?<代码>更新可能会响应用户事件。如果这些用户事件再次调用相同的函数,您将遇到问题
update\u idletasks
是安全的,因为它只响应“空闲”事件,如重新绘制屏幕。您绝对不应该使用
update
。相反,请使用
update\u idletasks
。为什么?<代码>更新可能会响应用户事件。如果这些用户事件再次调用相同的函数,您将遇到问题
update_idletasks
是安全的,因为它只响应“空闲”事件,如重新绘制屏幕。