python 视频下载器

import os
import requests
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import threading
import queue

# 创建一个队列用于线程间通信
progress_queue = queue.Queue()

def log(message):
    log_text.insert(tk.END, message + '\n')
    log_text.see(tk.END)

def download_file(i, url, directory, progress_queue):
    response = requests.get(url)
    if response.status_code == 200:
        filename = f'{directory}/test{i}.mp4'
        with open(filename, 'wb') as file:
            file.write(response.content)
        log(f"File {i} downloaded successfully.")
        # 下载成功后,将进度信息放入队列
        progress_queue.put((i, 'success'))
    else:
        log(f"Failed to download file {i}, status code: {response.status_code}")
        # 下载失败后,同样将信息放入队列
        progress_queue.put((i, 'failure'))

def update_progress(progress_var, num_files):
    # 主线程中定期检查队列并更新进度条
    while True:
        try:
            i, status = progress_queue.get_nowait()
#             if status == 'success':
            progress_var.set(progress_var.get() + (100 / num_files))
        except queue.Empty:
            break
    # 每隔100ms检查一次队列
    root.after(100, lambda: update_progress(progress_var, num_files))

def download_files(num, url, directory):
    threads = []
    for i in range(num):
        thread = threading.Thread(target=download_file, args=(i, url, directory, progress_queue))
        thread.start()
        threads.append(thread)

    for thread in threads:
        thread.join()

def start_download():
    try:
        num = int(num_entry.get())
        if num <= 0:
            messagebox.showwarning("输入错误", "数量必须大于0.")
            return

        url = url_entry.get()
        directory = 'videos'
        if not os.path.exists(directory):
            os.makedirs(directory)

        progress_var = tk.DoubleVar()
        progress_bar.config(variable=progress_var)
        progress_var.set(0)

        # 启动进度更新函数
        update_progress(progress_var, num)

        # 开始下载文件
        download_thread = threading.Thread(target=lambda: download_files(num, url, directory))
        download_thread.start()
    except ValueError:
        messagebox.showerror("输入错误", "请输入数字.")
    except Exception as e:
        messagebox.showerror("输入错误", str(e))

# 创建GUI界面
root = tk.Tk()
root.title("文件下载")

# 添加界面元素
# Create and place widgets
num_var = tk.IntVar(value=1)
num_label = tk.Label(root, text="下载文件的数量:")
num_label.pack()

num_entry = tk.Entry(root, textvariable=num_var)
num_entry.pack()

url_var = tk.StringVar(value='')
url_label = tk.Label(root, text="请求的地址:")
url_label.pack()

url_entry = tk.Entry(root, textvariable=url_var)
url_entry.pack()

progress_bar = ttk.Progressbar(root, orient='horizontal', length=800, mode='determinate')
progress_bar.pack()

log_label = tk.Label(root, text="日志:")
log_label.pack()

log_text = tk.Text(root, height=10, width=100)
log_text.pack()

download_button = tk.Button(root, text="开始下载", command=start_download)
download_button.pack()
# 运行事件循环
root.mainloop()
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值