如何为站点可用性检测工具的不同站点设置自定义定时检测间隔
实现按自定义时间间隔检测多站点可用性
原代码仅支持一次性批量检测所有站点,无法满足每个站点按用户自定义时间间隔重复更新状态的需求。以下是修改后的完整实现代码,核心思路是利用Tkinter的after()方法为每个站点创建独立的定时检测任务,完全适配不限数量的站点:
import tkinter as tk from tkinter import messagebox import requests data_list = [] window = tk.Tk() window.geometry('400x700') window.title("SiteChecker") def check_single_site(data): url_entry, time_entry, status_label, after_id = data url = url_entry.get().strip() # 检测URL有效性 if not url.startswith(('http://', 'https://')): status_label.config(text='无效URL') # 仍按设定时间重试 try: interval = int(time_entry.get().strip()) * 1000 # 转毫秒 if interval <= 0: raise ValueError data[3] = window.after(interval, check_single_site, data) except ValueError: status_label.config(text='时间无效') return # 发送请求检测站点状态 try: response = requests.get(url, timeout=5) if response.status_code == 200: status_label.config(text='status ok') else: status_label.config(text='status bad') except Exception as e: status_label.config(text='status bad') # 安排下一次检测 try: interval = int(time_entry.get().strip()) * 1000 # 转毫秒 if interval <= 0: raise ValueError data[3] = window.after(interval, check_single_site, data) except ValueError: status_label.config(text='时间无效') def start_checking(): # 先取消所有已存在的定时任务,避免重复启动 for data in data_list: if data[3] is not None: window.after_cancel(data[3]) data[3] = None # 为每个站点启动定时检测 for data in data_list: check_single_site(data) def add_new_site(): txt = tk.Entry(window, width=18) txt.grid(column=0, pady=8) row = txt.grid_info()['row'] tim = tk.Entry(window, width=3) tim.grid(row=row, column=1, pady=8) result = tk.Label(window, text="status") result.grid(row=row, column=2, pady=8) # 每个条目存储:URL输入框、时间输入框、状态标签、定时任务ID(初始为None) data_list.append([txt, tim, result, None]) # 初始化表头 tk.Label(window, text="站点URL:").grid(column=0, row=1) tk.Label(window, text="检测间隔(秒):").grid(column=1, row=1) tk.Label(window, text="状态:").grid(column=2, row=1) # 初始化4个默认站点行 for loop in range(2, 6): txt = tk.Entry(window, width=18) txt.grid(column=0, row=loop, pady=8) tim = tk.Entry(window, width=3) tim.grid(column=1, row=loop, pady=8) result = tk.Label(window, text="status") result.grid(column=2, row=loop, pady=8) data_list.append([txt, tim, result, None]) # 按钮布局 tk.Button(window, text="添加站点", command=add_new_site).grid(column=1, row=0) tk.Button(window, text="开始检测", command=start_checking).grid(row=0, column=2) window.mainloop()
关键改动说明:
- 扩展数据存储:每个站点条目新增
定时任务ID字段,用于后续取消或更新定时任务,避免重复执行 - 独立检测函数:
check_single_site负责单个站点的检测逻辑,完成后自动安排下一次检测,形成循环 - 非阻塞定时:使用Tkinter原生的
after()方法实现定时任务,完全不阻塞UI主循环,保证界面响应 - 输入合法性校验:检测URL格式和时间输入的有效性,对无效输入给出明确状态提示
- 重复启动防护:启动检测前先取消所有已存在的定时任务,避免多次点击"开始检测"导致任务叠加
内容的提问来源于stack exchange,提问作者EvgeniyMEV
相关产品推荐
相关产品推荐

