如何重构def函数以读取界面输入的URL并检测站点可用性?
重构URL可用性检测函数的解决方案
原代码存在的问题
- 直接遍历输入字符串的每个字符,而非拆分后的单个URL
- 未处理网络请求异常(如无效URL、网络断开、超时等)
- 每次检测结果单独弹出对话框,操作繁琐
- 未处理URL缺少
http://或https://前缀的情况,会导致请求失败
重构后的完整代码
import requests import re import tkinter from tkinter import * from tkinter import messagebox def SiteCheck(): # 清空结果框 result_text.delete(1.0, END) # 获取输入的文本并分割成URL列表 input_text = weight_tf.get("1.0", END).strip() if not input_text: messagebox.showwarning("提示", "请输入要检测的URL") return # 按换行、逗号、空格分割URL,过滤空字符串 urls = [url.strip() for url in re.split(r'[\n, ]+', input_text) if url.strip()] for url in urls: # 补全URL前缀 if not url.startswith(('http://', 'https://')): url = f'https://{url}' try: # 设置超时,避免长时间阻塞 response = requests.get(url, timeout=5) if response.status_code == 200: result_text.insert(END, f"✅ {url} - 可用 (状态码: {response.status_code})\n") else: result_text.insert(END, f"⚠️ {url} - 不可用 (状态码: {response.status_code})\n") except requests.exceptions.RequestException as e: result_text.insert(END, f"❌ {url} - 请求失败: {str(e)}\n") # 更新界面,避免卡顿 result_text.update() window = Tk() window.title("SiteChecker") window.geometry('600x400') frame = Frame( window, padx=10, pady=10 ) frame.pack(expand=True, fill=BOTH) # 输入标签和文本框(改用Text控件支持多行输入) weight_lb = Label( frame, text="输入要检测的URL(每行/逗号/空格分隔):" ) weight_lb.grid(row=0, column=0, sticky=W) weight_tf = Text( frame, height=8, width=60 ) weight_tf.grid(row=1, column=0, columnspan=2, pady=5) # 检测按钮 cal_btn = Button( frame, command=SiteCheck, text='开始检测', width=15 ) cal_btn.grid(row=2, column=1, sticky=E) # 结果展示区域 result_lb = Label( frame, text="检测结果:" ) result_lb.grid(row=3, column=0, sticky=W, pady=(10,0)) result_text = Text( frame, height=10, width=60, state=NORMAL ) result_text.grid(row=4, column=0, columnspan=2) window.mainloop()
关键修改说明
- 把输入控件从
Entry改为Text,支持多行输入URL,更符合使用习惯 - 使用正则表达式分割输入文本,兼容换行、逗号、空格作为分隔符
- 添加URL前缀补全逻辑,避免因缺少
http/https导致请求失败 - 加入异常捕获,处理各种网络请求错误(超时、连接失败等)
- 使用
Text控件展示所有检测结果,替代多次弹窗,提升体验 - 设置请求超时时间,避免界面长时间阻塞
- 每次检测前清空结果框,保证结果展示清晰
内容的提问来源于stack exchange,提问作者EvgeniyMEV
相关产品推荐
相关产品推荐

