【发布时间】:2021-10-07 20:01:44
【问题描述】:
我尝试制作一个带有下载按钮的 GUI,它从 Internet 下载文件。 还有一个进度条显示下载进度..
整个代码:
#minimal reproductive example..
import os
import time
import yaml
import urllib
import requests
import tempfile
import tkinter as tk
from tkinter import ttk
from tkinter import *
TEMP = tempfile.gettempdir()
def download(progressbar=None):
start = time.time()
url = 'https://proget.whirlpool.repl.co/information.yml'
local_filename = TEMP+"\\"+url.split('/')[-1]
url_file = urllib.request.urlopen(url)
size= url_file.headers["Content-Length"]
print("Starting to download file", end = "\r")
if progressbar:
progressbar['maximum'] = int(int(size)/1024)
with requests.get(url, stream=True) as r:
r.raise_for_status()
with open(local_filename, 'wb') as f:
sz = 0
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
sz = sz+8192
if progressbar:
progressbar['value'] = progressbar['value'] + 8192
os.system(local_filename)
def Download(*args):
download(progressbar=pb95)
root = tk.Tk()
style = ttk.Style(root)
pb95 = ttk.Progressbar(root,orient='horizontal', mode='determinate',length=500, maximum=1)
pb95.pack(side='top',fill='y')
downloadbtn = tk.Button(root,text='Download',font='Consolas 30', bg='green', fg='white',relief='flat', command=Download)
downloadbtn.pack(side='bottom',fill='x')
root.mainloop()
但是当我点击下载按钮时,整个窗口停止响应.. 一段时间后,当下载完成时,它会响应..进度条变为 100% 完成..
【问题讨论】:
-
我认为这是预期的行为。您调用的功能正在阻塞。我的建议是使用不同的
thread进行下载 -
@GáborErdős 我该怎么做?
-
您可以将
root.update()添加到 for 循环的末尾,但正如已经建议的那样,线程会是一个更好的主意 -
@scotty3785 有什么代码建议吗?
-
@scotty3785
root.update()可能仍然无法解决问题,具体取决于每次迭代到达.update()所需的时间,它会更新窗口,但它可能仍然没有响应,否则线程是更好的选择,但取决于循环需要多少资源,将非 tkinter 部分放在单独的进程中并使用Queues 和after()循环更新 tkinter 可能会更好(因为如果使用大量资源,tkinter 可能有点滞后,因为它与线程在同一进程上运行,如果要使用线程(启动新进程也更快))
标签: python user-interface tkinter urllib