如何实现多网站可用性定时检测?(附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()
实现思路与修改方案
核心问题解决点
统一管理网站条目
放弃txt1、tim1这类独立变量,改用列表存储每组的「网址输入框、间隔输入框、结果标签」,方便批量遍历和新增条目。异步定时检测
禁止使用time.sleep(),会阻塞Tkinter界面。改用Tkinter内置的after()方法,实现非阻塞的定时任务,每个网站按自己的间隔重复检测。封装单网站检测逻辑
写一个独立函数处理单个网站的检测、结果更新,并自动安排下一次检测。异常处理
网络请求可能出现地址无效、超时、无网络等问题,必须捕获异常,避免程序崩溃,同时在界面显示错误信息。
修改后的完整代码
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
相关产品推荐
相关产品推荐

