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

如何实现多网站可用性定时检测?(附Tkinter代码疑问)

多网站可用性检测工具实现方案

需求描述

我想用Tkinter制作带输入框的界面,通过HTTP状态码检测网站可用性。目前只能检测单个网站,不知道如何实现对所有输入框中的网站逐个检测,且为每个网站设置独立的检测间隔,附上尝试代码,求实现思路或提示。

尝试的代码

import tkinter as tk
from tkinter import ttk
import requests
import time
from tkinter import *
from tkinter import messagebox

window = Tk()
window.geometry('400x700')
window.title("SiteChecker")

def SiteCheck():
    res=int(tim1.get())
    Site_Value = txt1.get()
    Get_Response = requests.get(Site_Value)
    time.sleep(res)
    if Get_Response.status_code != 200:
        # 我知道需要用循环,但不知道怎么实现

def clicked():
    txt = Entry(window, width=18)
    txt.grid(column=0, pady=8)
    txt_row = txt.grid_info()['row']

    tim = Entry(window, width=3)
    tim.grid(row=txt_row, column=1, pady=8)

lbl1 = Label(window, text="Enter references:")
lbl1.grid(column=0, row=1)
lbl2 = Label(window, text="Enter the test time: ")
lbl2.grid(column=1, row=1)
lbl3 = Label(window, text="Availability status ")
lbl3.grid(column=2, row=1)

txt1 = Entry(window,width=18)
txt1.grid(column=0, row=2, pady=8)
txt2 = Entry(window,width=18)
txt2.grid(column=0, row=3,pady=8)
txt3 = Entry(window,width=18)
txt3.grid(column=0, row=4,pady=8)
txt4 = Entry(window,width=18)
txt4.grid(column=0, row=5,pady=8)
txt5 = Entry(window,width=18)
txt5.grid(column=0, row=6,pady=8)

tim1 = Entry(window,width=3)
tim1.grid(column=1, row=2, pady=8)
tim2 = Entry(window,width=3)
tim2.grid(column=1, row=3, pady=8)
tim3 = Entry(window,width=3)
tim3.grid(column=1, row=4, pady=8)
tim4 = Entry(window,width=3)
tim4.grid(column=1, row=5, pady=8)
tim5 = Entry(window,width=3)
tim5.grid(column=1, row=6, pady=8)

result1 = Label(window,text="status")
result1.grid(column=2, row=2, pady=8)
result2 = Label(window,text="status")
result2.grid(column=2, row=3, pady=8)
result3 = Label(window,text="status")
result3.grid(column=2, row=4, pady=8)
result4 = Label(window,text="status")
result4.grid(column=2, row=5, pady=8)
result5 = Label(window,text="status")
result5.grid(column=2, row=6, pady=8)

btn = Button(window, text="Add another site", command=clicked)
btn.grid(column=1, row = 0)

Check_Button = Button(
    window,
    command = SiteCheck,
    text='Start checking',
)
Check_Button.grid(row=0, column=2)

window.mainloop()

实现思路与修改方案

核心问题解决点

  1. 统一管理网站条目
    放弃txt1、tim1这类独立变量,改用列表存储每组的「网址输入框、间隔输入框、结果标签」,方便批量遍历和新增条目。

  2. 异步定时检测
    禁止使用time.sleep(),会阻塞Tkinter界面。改用Tkinter内置的after()方法,实现非阻塞的定时任务,每个网站按自己的间隔重复检测。

  3. 封装单网站检测逻辑
    写一个独立函数处理单个网站的检测、结果更新,并自动安排下一次检测。

  4. 异常处理
    网络请求可能出现地址无效、超时、无网络等问题,必须捕获异常,避免程序崩溃,同时在界面显示错误信息。

修改后的完整代码

import tkinter as tk
import requests

window = tk.Tk()
window.geometry('400x700')
window.title("SiteChecker")

# 存储所有网站条目:(网址输入框, 间隔输入框, 结果标签)
site_items = []

def check_single_site(site_entry, interval_entry, result_label):
    """检测单个网站并更新结果,自动安排下一次检测"""
    url = site_entry.get().strip()
    if not url:
        result_label.config(text="未输入网址", fg="gray")
        # 处理间隔输入,默认5秒
        try:
            interval = int(interval_entry.get().strip()) * 1000  # 转毫秒
        except ValueError:
            interval = 5000
        # 安排下一次检测
        window.after(interval, lambda: check_single_site(site_entry, interval_entry, result_label))
        return
    
    try:
        # 设置超时,避免请求卡住
        response = requests.get(url, timeout=10)
        if response.status_code == 200:
            result_label.config(text="✅ 正常", fg="green")
        else:
            result_label.config(text=f"❌ 异常: {response.status_code}", fg="red")
    except requests.exceptions.RequestException as e:
        # 捕获所有网络异常,显示简洁信息
        error_msg = str(e)[:20] + "..." if len(str(e)) > 20 else str(e)
        result_label.config(text=f"⚠️ 错误: {error_msg}", fg="orange")
    
    # 处理间隔输入,限制最小1秒
    try:
        interval = int(interval_entry.get().strip()) * 1000
        interval = max(interval, 1000)  # 最小1秒
    except ValueError:
        interval = 5000  # 默认5秒
    # 递归调用,实现循环检测
    window.after(interval, lambda: check_single_site(site_entry, interval_entry, result_label))

def start_checking():
    """遍历所有条目,启动检测任务"""
    for entry_group in site_items:
        check_single_site(*entry_group)

def add_new_site():
    """新增一组网站检测条目"""
    # 计算新条目的行号
    last_row = site_items[-1][0].grid_info()['row'] + 1 if site_items else 2
    
    site_entry = tk.Entry(window, width=18)
    site_entry.grid(column=0, row=last_row, pady=8)
    
    interval_entry = tk.Entry(window, width=3)
    interval_entry.grid(column=1, row=last_row, pady=8)
    
    result_label = tk.Label(window, text="待检测", fg="gray")
    result_label.grid(column=2, row=last_row, pady=8)
    
    site_items.append( (site_entry, interval_entry, result_label) )

# 初始化默认的5组条目
for row in range(2, 7):
    site_entry = tk.Entry(window, width=18)
    site_entry.grid(column=0, row=row, pady=8)
    
    interval_entry = tk.Entry(window, width=3)
    interval_entry.grid(column=1, row=row, pady=8)
    
    result_label = tk.Label(window, text="待检测", fg="gray")
    result_label.grid(column=2, row=row, pady=8)
    
    site_items.append( (site_entry, interval_entry, result_label) )

# 界面标题行
tk.Label(window, text="输入网址").grid(column=0, row=1)
tk.Label(window, text="间隔(秒)").grid(column=1, row=1)
tk.Label(window, text="状态").grid(column=2, row=1)

# 功能按钮
tk.Button(window, text="添加网站", command=add_new_site).grid(column=1, row=0)
tk.Button(window, text="开始检测", command=start_checking).grid(column=2, row=0)

window.mainloop()

代码说明

  • 条目管理:用site_items列表统一存储所有检测条目,新增网站时自动追加到列表,遍历检测时直接循环列表即可。
  • 异步定时:after()方法在指定毫秒后调用函数,不会阻塞界面,每个网站独立控制检测间隔。
  • 异常处理:捕获requests的所有请求异常,友好显示错误信息,避免程序崩溃。
  • 输入验证:处理间隔输入为空或非数字的情况,设置默认值和最小间隔限制。

内容的提问来源于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 07:05:21