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()
python 视频下载器
于 2024-07-31 14:46:53 首次发布