python - 如何在python中使用urllib接收用户想要检索的文件的大小

标签 python tkinter urllib python-3.8 tqdm

我基本上是Python的新手,我正在使用tkinter和urllib.request在Python中构建这个下载程序,它已经完成了,但作为最后的接触,我想添加一个进度条显示文件的下载量。我发现我可以使用 TQDM 添加进度条,但首先我应该获得用户想要下载的文件的大小,以显示程序已下载了多少文件,但我没有找到任何东西!谁能帮我吗? 我的代码(顺便说一句,如果您知道如何使我的代码更好,我将不胜感激):

from tkinter import *
from tkinter import font as tkFont
import random
import urllib.request


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="File", menu=submenu)
    submenu.add_command(label="New project...", command=printsth)
    submenu.add_command(label="New ", command=printsth)
    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 status bar
    status_bar = Label(root, text="This is only an example...", bd=1, relief=SUNKEN, anchor=W)
    status_bar.pack(side=BOTTOM, fill=X)

    # the download frame
    def download_image():
        global formatname
        if num.get() == 1:
            name = random.randrange(1, 10000)
        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())
        urllib.request.urlretrieve(url, fullname)
    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)
    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)
    inter_frame.pack(expand=1)
    root.mainloop()

    # the end!
main_menu()

最佳答案

要获取大小,请执行 HEAD 请求:

file_size = int(requests.head('https://www.cs.cmu.edu/~./enron/enron_mail_20150507.tar.gz', headers={'accept-encoding': ''}).headers['Content-Length'])

或者 GET 请求(可能不正确):

file size = int(requests.get('https://www.cs.cmu.edu/~./enron/enron_mail_20150507.tar.gz').headers['Content-Length'])

关于python - 如何在python中使用urllib接收用户想要检索的文件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61183038/

相关文章:

java - 如何在java或groovy中编写相当于python的os.path.relpath()

python - 使用 Python 和 Tkinter 制作一个简单的 GUI,我将无法识别的选择器发送到实例

Python 序列命名约定

python - 如何在 Python 中扩展/连接两个迭代器

python - 从多处理计算更新 TKinter GUI

python - request.urlretrieve 在 PythonAnywhere 中作为计划任务运行时失败

python - “模块”没有属性 'urlencode'

python - 使用 Python 将图片发布到 Facebook

python - xlrd/xlutils 重新排序电子表格行

Python Tkinter 多个命令