为什么这个软件在运行了一次之后就无响应?怎么解决?写出完整的修改之后的代码吧:import tkinter as tk
from tkinter import messagebox, ttk
import requests
import os
import time
import random
import logging
import json
# 配置日志记录
logging.basicConfig(filename='download.log', level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
def save_config(url, folder, min_interval, max_interval):
config = {
"url": url,
"folder": folder,
"min_interval": min_interval,
"max_interval": max_interval
}
with open('config.json', 'w') as f:
json.dump(config, f)
def load_config():
if os.path.exists('config.json'):
with open('config.json', 'r') as f:
config = json.load(f)
return config
return {}
def download_file(url, save_path, progress_bar, log_text, max_retries=3):
retries = 0
while retries < max_retries:
try:
response = requests.get(url, stream=True)
response.raise_for_status()
total_size = int(response.headers.get('content-length', 0))
block_size = 1024
wrote = 0
with open(save_path, 'wb') as file:
for data in response.iter_content(block_size):
wrote = wrote + len(data)
file.write(data)
if total_size != 0:
progress = (wrote / total_size) * 100
progress_bar['value'] = progress
log_text.insert(tk.END, f"下载进度: {progress:.2f}%\n")
log_text.see(tk.END)
logging.info(f"成功下载文件: {url} 到 {save_path}")
log_text.insert(tk.END, f"成功下载文件: {url} 到 {save_path}\n")
log_text.see(tk.END)
return True
except requests.RequestException as e:
retries += 1
logging.error(f"下载 {url} 失败,第 {retries} 次重试: {e}")
log_text.insert(tk.END, f"下载 {url} 失败,第 {retries} 次重试: {e}\n")
log_text.see(tk.END)
logging.error(f"下载 {url} 失败,达到最大重试次数")
log_text.insert(tk.END, f"下载 {url} 失败,达到最大重试次数\n")
log_text.see(tk.END)
return False
def start_download(url_entry, folder_entry, min_interval_entry, max_interval_entry, progress_bar, log_text):
url = url_entry.get()
folder = folder_entry.get()
min_interval = int(min_interval_entry.get())
max_interval = int(max_interval_entry.get())
save_config(url, folder, min_interval, max_interval)
if not os.path.exists(folder):
os.makedirs(folder)
while True:
file_name = url.split("/")[-1]
save_path = os.path.join(folder, file_name)
if download_file(url, save_path, progress_bar, log_text):
messagebox.showinfo("下载成功", f"文件 {file_name} 下载成功!")
else:
messagebox.showerror("下载失败", f"文件 {file_name} 下载失败!")
interval = random.randint(min_interval, max_interval)
logging.info(f"下次下载将在 {interval} 秒后进行")
log_text.insert(tk.END, f"下次下载将在 {interval} 秒后进行\n")
log_text.see(tk.END)
time.sleep(interval)
# 创建主窗口
root = tk.Tk()
root.title("定时文件下载器")
# URL 输入框
url_label = tk.Label(root, text="文件 URL:")
url_label.pack()
url_entry = tk.Entry(root, width=50)
url_entry.pack()
# 保存文件夹输入框
folder_label = tk.Label(root, text="保存文件夹:")
folder_label.pack()
folder_entry = tk.Entry(root, width=50)
folder_entry.pack()
# 最小间隔输入框
min_interval_label = tk.Label(root, text="最小下载间隔 (秒):")
min_interval_label.pack()
min_interval_entry = tk.Entry(root, width=10)
min_interval_entry.pack()
# 最大间隔输入框
max_interval_label = tk.Label(root, text="最大下载间隔 (秒):")
max_interval_label.pack()
max_interval_entry = tk.Entry(root, width=10)
max_interval_entry.pack()
# 进度条
progress_bar = ttk.Progressbar(root, orient="horizontal", length=300, mode="determinate")
progress_bar.pack()
# 日志文本框
log_text = tk.Text(root, height=10, width=50)
log_text.pack()
# 开始下载按钮
start_button = tk.Button(root, text="开始下载", command=lambda: start_download(url_entry, folder_entry, min_interval_entry, max_interval_entry, progress_bar, log_text))
start_button.pack()
# 加载配置
config = load_config()
if config:
url_entry.insert(0, config.get("url", ""))
folder_entry.insert(0, config.get("folder", ""))
min_interval_entry.insert(0, config.get("min_interval", ""))
max_interval_entry.insert(0, config.get("max_interval", ""))
# 运行主循环
root.mainloop()