You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为站点可用性检测工具的不同站点设置自定义定时检测间隔

实现按自定义时间间隔检测多站点可用性

原代码仅支持一次性批量检测所有站点,无法满足每个站点按用户自定义时间间隔重复更新状态的需求。以下是修改后的完整实现代码,核心思路是利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:10:31