python - 如何在python中创建下载栏
问题描述
所以我正在开发这个程序,该程序应该使用tkinter 和 urllib.request从网上下载东西,但它缺少下载栏(或进度条,如果这是真的的话)。所以我发现你可以使用TQDM创建进度条但是有两个问题:首先,我似乎没有找到在 tkinter 程序中使用它的方法。其次,它不显示下载速度,您只需设置一个限制,它就会填满,直到达到该限制。我又做了一些研究,发现可以使用ttk创建进度条但它仍然存在第二个问题(它没有显示用户的互联网(下载)速度以及像 chrome 的下载栏一样下载了多少文件)。有人可以帮我解决这个问题吗?我的代码(顺便说一句,如果您对如何使我的程序更好,我将不胜感激):
from tkinter import *
from tkinter import font as tkFont
import random
import urllib.request
import requests
from tqdm import tqdm
from tqdm.auto import tqdm
def printsth():
print("Yay it works! ")
def main_menu():
root = Tk()
# the top menu
num = IntVar()
# var = IntVar()
menu = Menu(root)
root.config(menu=menu)
submenu = Menu(menu)
menu.add_cascade(label="Settings", menu=submenu)
def custom_op():
custom = Tk()
custom.mainloop()
submenu.add_command(label="Customization ", command=custom_op)
def settings_op():
set_win = Tk()
set_win.mainloop()
submenu.add_command(label="Settings ", command=settings_op)
submenu.add_separator()
submenu.add_command(label="Exit", command=root.destroy)
# the edit menu
editmenu = Menu(menu)
menu.add_cascade(label="Edit", menu=editmenu)
editmenu.add_command(label="Redo...", command=printsth)
# the tool bar
toolbar = Frame(root, bg="light gray")
insert_button = Button(toolbar, text="Insert an image", command=printsth)
insert_button.pack(side=LEFT, padx=2, pady=2)
print_button = Button(toolbar, text="Print", command=printsth)
print_button.pack(side=LEFT, padx=2, pady=2)
toolbar.pack(side=TOP, fill=X)
# the download function
def download_image():
global formatname
if num.get() == 1:
name = random.randrange(1, 100000)
else:
name = str(name_entry.get())
formatname = str(format_entry.get())
'''if var.get() == 1:
operator = str(url_entry.get())
formatname = '.' + operator[-3] + operator[-2] + operator[-1]
else:
pass'''
fullname = str(name) + formatname
url = str(url_entry.get())
fw = open('file-size.txt', 'w')
file_size = int(requests.head(url, headers={'accept-encoding': ''}).headers['Content-Length'])
fw.write(str(file_size))
fw.close()
path = str(output_entry.get()) + "\\"
urllib.request.urlretrieve(url, path.replace("\\", "\\\\") + fullname)
# the status bar
status_bar = Label(root, text="Downloading...", bd=1, relief=SUNKEN, anchor=W)
status_bar.pack(side=BOTTOM, fill=X)
# the download frame
body_frame = Frame(root, bg="light blue")
download_button = Button(body_frame, text="Download! ", command=download_image, border=3, width=20, height=5)
download_design = tkFont.Font(size=12, slant='italic')
download_button['font'] = download_design
download_button.pack(side=LEFT, pady=5, padx=5)
body_frame.pack(side=LEFT, fill=Y)
# the main interaction menu
inter_frame = Frame(root)
url_entry = Entry(inter_frame)
label = Label(inter_frame, text="Enter the image URL: ")
file_format = Label(inter_frame, text="Choose your file format: ")
format_entry = Entry(inter_frame)
file_name = Label(inter_frame, text="File's name: ")
name_entry = Entry(inter_frame)
check_name = Checkbutton(inter_frame, text="Give a random name", variable=num)
# check_format = Checkbutton(inter_frame, text="Download with default format", variable=var)
output_path = Label(inter_frame, text="Choose output path: ")
output_entry = Entry(inter_frame)
file_name.pack(anchor=CENTER, expand=1)
name_entry.pack(anchor=CENTER, expand=1)
check_name.pack(anchor=CENTER, expand=1)
label.pack(anchor=CENTER, expand=1)
url_entry.pack(anchor=CENTER, expand=1)
file_format.pack(anchor=CENTER, expand=1)
format_entry.pack(anchor=CENTER, expand=1)
# check_format.pack(anchor=CENTER)
output_path.pack(anchor=CENTER, expand=1)
output_entry.pack(anchor=CENTER, expand=1)
inter_frame.pack(expand=1)
root.mainloop()
# the end!
main_menu()
解决方案
这是我的状态栏工具中的代码片段
progress = ttk.Progressbar(self, orient=HORIZONTAL, length=400, mode='determinate')
progress.grid(row=3, column=0, pady=2, padx=2, columnspan=4, sticky=SW+SE)
progress.pack(side=BOTTOM, anchor=S, expand=YES)
progress["maximum"] = 100
progerss_part = 0
您可以使用更新进度
progress["value"] = x
希望这会帮助你。
推荐阅读
- android - 我的播放器应用程序在某些设备上不断被杀死
- reactjs - 无法访问会话(存储的 cookie)时如何保护反应路由?
- sql - Oracle:分层查询连接方式
- sql-server - SQL Server:在单列中转换多行
- html - Jumbotron 和页脚没有延伸到手机屏幕设备的宽度
- augmented-reality - 为什么 .reality 文件的文件大小比 .usdz 大得多?
- python - learning_curve 中的自定义评分
- python - Python中有一个函数可以找到两个字典之间的差异吗?
- java - 如何在java中合并两个嵌套的HashMap
- docker - 无法从主机访问在 docker 中创建的 kafka 代理