win断网记录工具

查看 63|回复 10
作者:kp666   
本软件的目的是为了监控网络断网时间,本来论坛有一个但是年久链接不可用所以说开发此软件,欢迎各位大佬指正


image.png (28.86 KB, 下载次数: 0)
下载附件
主界面
2025-8-16 17:52 上传



image.png (51.8 KB, 下载次数: 0)
下载附件
关闭的界面
2025-8-16 17:53 上传

下载链接https://wwtz.lanzoul.com/iXcge33oifdc
密码:6jpg
[Python] 纯文本查看 复制代码import os
import sys
import time
import datetime
import threading
import platform
import tkinter as tk
import subprocess
from tkinter import ttk, messagebox, scrolledtext
from collections import deque
class NetworkMonitor:
    def __init__(self, root):
        self.root = root
        self.root.title("断网记录工具-by昆鹏")
        self.root.geometry("900x600")  # 增大窗口尺寸以容纳新功能
        self.root.resizable(True, True)
        # 状态变量
        self.monitoring = False  # 是否正在监控
        self.is_disconnected = False  # 是否断网
        self.disconnect_start = None  # 断网开始时间
        self.timer = None  # 定时任务
        self.start_time = None  # 程序启动时间
        self.disconnect_count = 0  # 断网次数统计
        self.disconnect_events = deque(maxlen=100)  # 存储断网事件,最多100条
        
        # 日志文件日期跟踪
        self.current_log_date = datetime.datetime.now().strftime('%Y%m%d')  # 当前日志日期
        self.log_filename = f"network_log_{self.current_log_date}.txt"  # 初始日志文件名
        self.start_time = datetime.datetime.now()  # 记录启动时间
        # 界面组件
        self.create_widgets()
        # 记录启动日志
        self.log_message(f"程序启动时间: {self.start_time.strftime('%Y-%m-%d %H:%M:%S')}")
    def create_widgets(self):
        # 主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.pack(fill=tk.BOTH, expand=True)
        
        # 顶部控制面板
        control_frame = ttk.LabelFrame(main_frame, text="监控设置", padding="10")
        control_frame.pack(fill=tk.X, padx=5, pady=5)
        
        # 1. 目标域名输入
        frame_domain = ttk.Frame(control_frame, padding="5")
        frame_domain.pack(fill=tk.X)
        ttk.Label(frame_domain, text="目标域名/IP:").pack(side=tk.LEFT, padx=5)
        self.domain_var = tk.StringVar(value="www.baidu.com")
        ttk.Entry(frame_domain, textvariable=self.domain_var, width=30).pack(side=tk.LEFT, padx=5)
        # 2. 检测间隔设置
        frame_interval = ttk.Frame(control_frame, padding="5")
        frame_interval.pack(fill=tk.X)
        ttk.Label(frame_interval, text="检测间隔(秒):").pack(side=tk.LEFT, padx=5)
        self.interval_var = tk.IntVar(value=5)
        interval_spin = ttk.Spinbox(
            frame_interval,
            from_=1,
            to=300,
            textvariable=self.interval_var,
            width=5
        )
        interval_spin.pack(side=tk.LEFT, padx=5)
        # 3. 开始/停止按钮
        frame_btn = ttk.Frame(control_frame, padding="5")
        frame_btn.pack(fill=tk.X)
        self.btn_start_stop = ttk.Button(
            frame_btn,
            text="开始监控",
            command=self.toggle_monitor
        )
        self.btn_start_stop.pack(pady=5)
        # 4. 状态显示
        frame_status = ttk.Frame(control_frame, padding="5")
        frame_status.pack(fill=tk.X)
        ttk.Label(frame_status, text="当前状态:").pack(side=tk.LEFT, padx=5)
        self.status_var = tk.StringVar(value="未监控")
        self.status_label = ttk.Label(
            frame_status,
            textvariable=self.status_var,
            foreground="gray"
        )
        self.status_label.pack(side=tk.LEFT, padx=5)
        
        # 统计信息
        frame_stats = ttk.Frame(control_frame, padding="5")
        frame_stats.pack(fill=tk.X)
        ttk.Label(frame_stats, text="启动时间:").pack(side=tk.LEFT, padx=5)
        self.start_time_var = tk.StringVar(value="")
        ttk.Label(frame_stats, textvariable=self.start_time_var).pack(side=tk.LEFT, padx=5)
        
        ttk.Label(frame_stats, text="断网次数:").pack(side=tk.LEFT, padx=10)
        self.disconnect_count_var = tk.StringVar(value="0")
        ttk.Label(frame_stats, textvariable=self.disconnect_count_var).pack(side=tk.LEFT, padx=5)
        # 5. 日志路径显示
        frame_log = ttk.Frame(control_frame, padding="5")
        frame_log.pack(fill=tk.X)
        ttk.Label(frame_log, text="日志路径:").pack(anchor=tk.W, padx=5, pady=2)
        self.log_path_var = tk.StringVar(value="")
        ttk.Label(
            frame_log,
            textvariable=self.log_path_var,
            foreground="blue",
            wraplength=450
        ).pack(anchor=tk.W, padx=5, fill=tk.X)
        # 断网记录显示区域
        record_frame = ttk.LabelFrame(main_frame, text="断网记录", padding="10")
        record_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
        
        # 创建带滚动条的文本区域
        self.record_text = scrolledtext.ScrolledText(
            record_frame,
            wrap=tk.WORD,
            height=15,
            state=tk.DISABLED  # 初始为禁用状态,只能通过代码更新
        )
        self.record_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
        
        # 分页控制
        page_frame = ttk.Frame(record_frame)
        page_frame.pack(fill=tk.X, pady=5)
        
        ttk.Label(page_frame, text="页码:").pack(side=tk.LEFT, padx=5)
        self.page_var = tk.IntVar(value=1)
        self.page_spin = ttk.Spinbox(
            page_frame,
            from_=1,
            to=1,
            textvariable=self.page_var,
            width=5,
            state='readonly'
        )
        self.page_spin.pack(side=tk.LEFT, padx=5)
        
        ttk.Label(page_frame, text="/ 1").pack(side=tk.LEFT, padx=5)
        self.total_pages_var = tk.StringVar(value="/ 1")
        
        ttk.Button(page_frame, text="上一页", command=self.prev_page).pack(side=tk.LEFT, padx=5)
        ttk.Button(page_frame, text="下一页", command=self.next_page).pack(side=tk.LEFT, padx=5)
        ttk.Button(page_frame, text="刷新", command=self.update_record_display).pack(side=tk.LEFT, padx=5)
        
        # 状态栏
        status_bar = ttk.Frame(self.root, padding="5")
        status_bar.pack(side=tk.BOTTOM, fill=tk.X)
        self.status_bar_var = tk.StringVar(value="就绪")
        ttk.Label(status_bar, textvariable=self.status_bar_var).pack(side=tk.LEFT)
        # 初始化日志路径显示
        self.update_log_path()
        self.start_time_var.set(self.start_time.strftime("%Y-%m-%d %H:%M:%S"))
    def update_log_path(self):
        """更新日志文件路径显示"""
        log_path = os.path.join(os.getcwd(), self.log_filename)
        self.log_path_var.set(log_path)
    def toggle_monitor(self):
        """切换监控状态(开始/停止)"""
        if not self.monitoring:
            # 开始监控
            domain = self.domain_var.get().strip()
            if not domain:
                messagebox.showerror("错误", "请输入目标域名或IP")
                return
            interval = self.interval_var.get()
            self.monitoring = True
            self.btn_start_stop.config(text="停止监控")
            self.status_var.set(f"监控中 (目标: {domain}, 间隔: {interval}秒)")
            self.status_label.config(foreground="green")
            self.status_bar_var.set(f"开始监控: {domain}, 间隔: {interval}秒")
            
            # 记录开始日志
            self.log_message(f"监控开始 - 目标: {domain}, 检测间隔: {interval}秒")
            
            # 立即执行一次检测,然后定时循环
            self.check_network()
        else:
            # 停止监控
            self.monitoring = False
            if self.timer:
                self.timer.cancel()
            self.btn_start_stop.config(text="开始监控")
            self.status_var.set("未监控")
            self.status_label.config(foreground="gray")
            self.log_message("监控停止")
            self.status_bar_var.set("监控已停止")
    def check_network(self):
        """检测网络连接状态 - 使用subprocess避免弹出命令窗口"""
        if not self.monitoring:
            return
        domain = self.domain_var.get().strip()
        interval = self.interval_var.get()
        # 创建ping命令参数
        if platform.system().lower() == "windows":
            command = ["ping", "-n", "1", "-w", "1000", domain]
            # 设置标志以隐藏窗口
            startupinfo = subprocess.STARTUPINFO()
            startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
            startupinfo.wShowWindow = 0  # 0 = SW_HIDE
        else:  # Linux/macOS
            command = ["ping", "-c", "1", "-W", "1", domain]
            startupinfo = None
        try:
            # 执行ping命令而不显示窗口
            result = subprocess.run(
                command,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                creationflags=subprocess.CREATE_NO_WINDOW if platform.system().lower() == "windows" else 0,
                startupinfo=startupinfo
            )
            # 在Windows上,返回码0表示成功;在Linux上,0也表示成功
            response = (result.returncode == 0)
        except Exception as e:
            response = False
            self.log_message(f"检测异常: {str(e)}")
        # 处理网络状态
        if not response:
            # 断网状态
            if not self.is_disconnected:
                self.is_disconnected = True
                self.disconnect_start = datetime.datetime.now()
                start_time = self.disconnect_start.strftime("%Y-%m-%d %H:%M:%S")
                self.status_var.set(f"断网中 (开始于: {start_time})")
                self.status_label.config(foreground="red")
                self.status_bar_var.set(f"检测到断网: {start_time}")
                self.log_message(f"【断网开始】{start_time} - 目标: {domain}")
        else:
            # 网络正常
            if self.is_disconnected:
                # 从断网恢复
                self.is_disconnected = False
                recover_time = datetime.datetime.now()
                duration = recover_time - self.disconnect_start
                # 格式化时长(时:分:秒)
                duration_seconds = duration.total_seconds()
                hours, remainder = divmod(duration_seconds, 3600)
                minutes, seconds = divmod(remainder, 60)
                duration_str = f"{int(hours)}小时{int(minutes)}分{int(seconds)}秒"
               
                # 格式化时间范围
                start_str = self.disconnect_start.strftime("%Y年%m月%d日%H:%M:%S")
                end_str = recover_time.strftime("%Y年%m月%d日%H:%M:%S")
               
                # 记录事件
                self.disconnect_count += 1
                self.disconnect_events.append({
                    'start': self.disconnect_start,
                    'end': recover_time,
                    'duration': duration,
                    'domain': domain
                })
               
                # 更新界面
                self.disconnect_count_var.set(str(self.disconnect_count))
                self.status_var.set(f"监控中 (网络正常)")
                self.status_label.config(foreground="green")
                self.status_bar_var.set(f"网络恢复,断网时长: {duration_str}")
               
                # 记录日志
                log_message = f"【断网恢复】{end_str} - 目标: {domain} - 断网时长: {duration_str}"
                self.log_message(log_message)
               
                # 更新记录显示
                self.update_record_display()
        # 定时执行下一次检测
        self.timer = threading.Timer(interval, self.check_network)
        self.timer.start()
    def log_message(self, content):
        """将信息写入日志文件,并处理日期变更"""
        # 检查日期是否变更
        today = datetime.datetime.now().strftime('%Y%m%d')
        if today != self.current_log_date:
            # 日期变更,创建新日志文件
            self.current_log_date = today
            self.log_filename = f"network_log_{today}.txt"
            self.update_log_path()  # 更新界面显示的日志路径
            
            # 在新文件中添加日期变更标记
            try:
                with open(self.log_filename, "a", encoding="utf-8") as f:
                    f.write(f"=== 日志日期已变更至 {today} ===\n")
            except Exception:
                pass  # 如果创建新日志失败,继续尝试写入
        # 写入日志内容
        try:
            with open(self.log_filename, "a", encoding="utf-8") as f:
                timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                f.write(f"[{timestamp}] {content}\n")
        except Exception as e:
            messagebox.showerror("日志错误", f"写入日志失败: {str(e)}")
    def update_record_display(self):
        """更新断网记录显示"""
        # 启用文本区域进行编辑
        self.record_text.config(state=tk.NORMAL)
        self.record_text.delete(1.0, tk.END)
        
        if not self.disconnect_events:
            self.record_text.insert(tk.END, "暂无断网记录")
            self.record_text.config(state=tk.DISABLED)
            return
        
        # 添加表头
        header = "序号 | 开始时间                | 结束时间                | 持续时间       | 目标\n"
        separator = "-" * 80 + "\n"
        self.record_text.insert(tk.END, header)
        self.record_text.insert(tk.END, separator)
        
        # 添加记录
        for idx, event in enumerate(reversed(self.disconnect_events), 1):
            start_str = event['start'].strftime("%Y-%m-%d %H:%M:%S")
            end_str = event['end'].strftime("%Y-%m-%d %H:%M:%S")
            
            # 计算持续时间
            duration = event['duration']
            hours, remainder = divmod(duration.total_seconds(), 3600)
            minutes, seconds = divmod(remainder, 60)
            duration_str = f"{int(hours)}h {int(minutes)}m {int(seconds)}s"
            
            # 格式化行
            line = f"{idx:4d} | {start_str} | {end_str} | {duration_str:>10} | {event['domain']}\n"
            self.record_text.insert(tk.END, line)
        
        # 禁用文本区域防止用户编辑
        self.record_text.config(state=tk.DISABLED)
        
        # 更新分页控件
        self.update_pagination()
    def update_pagination(self):
        """更新分页控件状态"""
        # 当前实现显示所有记录,后续可扩展为真实分页
        self.page_spin.config(to=1)
        self.page_var.set(1)
        self.total_pages_var.set("/ 1")
    def prev_page(self):
        """上一页"""
        current_page = self.page_var.get()
        if current_page > 1:
            self.page_var.set(current_page - 1)
            # 这里可以添加加载上一页数据的逻辑
    def next_page(self):
        """下一页"""
        current_page = self.page_var.get()
        total_pages = 1  # 目前只有一页
        if current_page 本软件源目的是为了记录一下断网的时间方便定位问题所在~
之前论坛有个类似的软件但是链接失效了~
所以说有了这个软件
![]()
使用python语言进行开发,欢迎各位大佬进行补充指正
import os
import sys
import time
import datetime
import threading
import platform
import tkinter as tk
import subprocess
from tkinter import ttk, messagebox, scrolledtext
from collections import deque
class NetworkMonitor:
    def __init__(self, root):
        self.root = root
        self.root.title("断网记录工具-by昆鹏")
        self.root.geometry("600x600")  # 增大窗口尺寸以容纳新功能
        self.root.resizable(True, True)
        # 状态变量
        self.monitoring = False  # 是否正在监控
        self.is_disconnected = False  # 是否断网
        self.disconnect_start = None  # 断网开始时间
        self.timer = None  # 定时任务
        self.start_time = None  # 程序启动时间
        self.disconnect_count = 0  # 断网次数统计
        self.disconnect_events = deque(maxlen=100)  # 存储断网事件,最多100条
        # 日志文件日期跟踪
        self.current_log_date = datetime.datetime.now().strftime('%Y%m%d')  # 当前日志日期
        self.log_filename = f"network_log_{self.current_log_date}.txt"  # 初始日志文件名
        self.start_time = datetime.datetime.now()  # 记录启动时间
        # 界面组件
        self.create_widgets()
        # 记录启动日志
        self.log_message(f"程序启动时间: {self.start_time.strftime('%Y-%m-%d %H:%M:%S')}")
    def create_widgets(self):
        # 主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.pack(fill=tk.BOTH, expand=True)
        # 顶部控制面板
        control_frame = ttk.LabelFrame(main_frame, text="监控设置", padding="10")
        control_frame.pack(fill=tk.X, padx=5, pady=5)
        # 1. 目标域名输入
        frame_domain = ttk.Frame(control_frame, padding="5")
        frame_domain.pack(fill=tk.X)
        ttk.Label(frame_domain, text="目标域名/IP:").pack(side=tk.LEFT, padx=5)
        self.domain_var = tk.StringVar(value="www.baidu.com")
        ttk.Entry(frame_domain, textvariable=self.domain_var, width=30).pack(side=tk.LEFT, padx=5)
        # 2. 检测间隔设置
        frame_interval = ttk.Frame(control_frame, padding="5")
        frame_interval.pack(fill=tk.X)
        ttk.Label(frame_interval, text="检测间隔(秒):").pack(side=tk.LEFT, padx=5)
        self.interval_var = tk.IntVar(value=5)
        interval_spin = ttk.Spinbox(
            frame_interval,
            from_=1,
            to=300,
            textvariable=self.interval_var,
            width=5
        )
        interval_spin.pack(side=tk.LEFT, padx=5)
        # 3. 开始/停止按钮
        frame_btn = ttk.Frame(control_frame, padding="5")
        frame_btn.pack(fill=tk.X)
        self.btn_start_stop = ttk.Button(
            frame_btn,
            text="开始监控",
            command=self.toggle_monitor
        )
        self.btn_start_stop.pack(pady=5)
        # 4. 状态显示
        frame_status = ttk.Frame(control_frame, padding="5")
        frame_status.pack(fill=tk.X)
        ttk.Label(frame_status, text="当前状态:").pack(side=tk.LEFT, padx=5)
        self.status_var = tk.StringVar(value="未监控")
        self.status_label = ttk.Label(
            frame_status,
            textvariable=self.status_var,
            foreground="gray"
        )
        self.status_label.pack(side=tk.LEFT, padx=5)
        # 统计信息
        frame_stats = ttk.Frame(control_frame, padding="5")
        frame_stats.pack(fill=tk.X)
        ttk.Label(frame_stats, text="启动时间:").pack(side=tk.LEFT, padx=5)
        self.start_time_var = tk.StringVar(value="")
        ttk.Label(frame_stats, textvariable=self.start_time_var).pack(side=tk.LEFT, padx=5)
        ttk.Label(frame_stats, text="断网次数:").pack(side=tk.LEFT, padx=10)
        self.disconnect_count_var = tk.StringVar(value="0")
        ttk.Label(frame_stats, textvariable=self.disconnect_count_var).pack(side=tk.LEFT, padx=5)
        # 5. 日志路径显示
        frame_log = ttk.Frame(control_frame, padding="5")
        frame_log.pack(fill=tk.X)
        ttk.Label(frame_log, text="日志路径:").pack(anchor=tk.W, padx=5, pady=2)
        self.log_path_var = tk.StringVar(value="")
        ttk.Label(
            frame_log,
            textvariable=self.log_path_var,
            foreground="blue",
            wraplength=450
        ).pack(anchor=tk.W, padx=5, fill=tk.X)
        # 断网记录显示区域
        record_frame = ttk.LabelFrame(main_frame, text="断网记录", padding="10")
        record_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
        # 创建带滚动条的文本区域
        self.record_text = scrolledtext.ScrolledText(
            record_frame,
            wrap=tk.WORD,
            height=15,
            state=tk.DISABLED  # 初始为禁用状态,只能通过代码更新
        )
        self.record_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
        # 分页控制
        page_frame = ttk.Frame(record_frame)
        page_frame.pack(fill=tk.X, pady=5)
        ttk.Label(page_frame, text="页码:").pack(side=tk.LEFT, padx=5)
        self.page_var = tk.IntVar(value=1)
        self.page_spin = ttk.Spinbox(
            page_frame,
            from_=1,
            to=1,
            textvariable=self.page_var,
            width=5,
            state='readonly'
        )
        self.page_spin.pack(side=tk.LEFT, padx=5)
        ttk.Label(page_frame, text="/ 1").pack(side=tk.LEFT, padx=5)
        self.total_pages_var = tk.StringVar(value="/ 1")
        ttk.Button(page_frame, text="上一页", command=self.prev_page).pack(side=tk.LEFT, padx=5)
        ttk.Button(page_frame, text="下一页", command=self.next_page).pack(side=tk.LEFT, padx=5)
        ttk.Button(page_frame, text="刷新", command=self.update_record_display).pack(side=tk.LEFT, padx=5)
        # 状态栏
        status_bar = ttk.Frame(self.root, padding="5")
        status_bar.pack(side=tk.BOTTOM, fill=tk.X)
        self.status_bar_var = tk.StringVar(value="就绪")
        ttk.Label(status_bar, textvariable=self.status_bar_var).pack(side=tk.LEFT)
        # 初始化日志路径显示
        self.update_log_path()
        self.start_time_var.set(self.start_time.strftime("%Y-%m-%d %H:%M:%S"))
    def update_log_path(self):
        """更新日志文件路径显示"""
        log_path = os.path.join(os.getcwd(), self.log_filename)
        self.log_path_var.set(log_path)
    def toggle_monitor(self):
        """切换监控状态(开始/停止)"""
        if not self.monitoring:
            # 开始监控
            domain = self.domain_var.get().strip()
            if not domain:
                messagebox.showerror("错误", "请输入目标域名或IP")
                return
            interval = self.interval_var.get()
            self.monitoring = True
            self.btn_start_stop.config(text="停止监控")
            self.status_var.set(f"监控中 (目标: {domain}, 间隔: {interval}秒)")
            self.status_label.config(foreground="green")
            self.status_bar_var.set(f"开始监控: {domain}, 间隔: {interval}秒")
            # 记录开始日志
            self.log_message(f"监控开始 - 目标: {domain}, 检测间隔: {interval}秒")
            # 立即执行一次检测,然后定时循环
            self.check_network()
        else:
            # 停止监控
            self.monitoring = False
            if self.timer:
                self.timer.cancel()
            self.btn_start_stop.config(text="开始监控")
            self.status_var.set("未监控")
            self.status_label.config(foreground="gray")
            self.log_message("监控停止")
            self.status_bar_var.set("监控已停止")
    def check_network(self):
        """检测网络连接状态 - 使用subprocess避免弹出命令窗口"""
        if not self.monitoring:
            return
        domain = self.domain_var.get().strip()
        interval = self.interval_var.get()
        # 创建ping命令参数
        if platform.system().lower() == "windows":
            command = ["ping", "-n", "1", "-w", "1000", domain]
            # 设置标志以隐藏窗口
            startupinfo = subprocess.STARTUPINFO()
            startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
            startupinfo.wShowWindow = 0  # 0 = SW_HIDE
        else:  # Linux/macOS
            command = ["ping", "-c", "1", "-W", "1", domain]
            startupinfo = None
        try:
            # 执行ping命令而不显示窗口
            result = subprocess.run(
                command,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                creationflags=subprocess.CREATE_NO_WINDOW if platform.system().lower() == "windows" else 0,
                startupinfo=startupinfo
            )
            # 在Windows上,返回码0表示成功;在Linux上,0也表示成功
            response = (result.returncode == 0)
        except Exception as e:
            response = False
            self.log_message(f"检测异常: {str(e)}")
        # 处理网络状态
        if not response:
            # 断网状态
            if not self.is_disconnected:
                self.is_disconnected = True
                self.disconnect_start = datetime.datetime.now()
                start_time = self.disconnect_start.strftime("%Y-%m-%d %H:%M:%S")
                self.status_var.set(f"断网中 (开始于: {start_time})")
                self.status_label.config(foreground="red")
                self.status_bar_var.set(f"检测到断网: {start_time}")
                self.log_message(f"【断网开始】{start_time} - 目标: {domain}")
        else:
            # 网络正常
            if self.is_disconnected:
                # 从断网恢复
                self.is_disconnected = False
                recover_time = datetime.datetime.now()
                duration = recover_time - self.disconnect_start
                # 格式化时长(时:分:秒)
                duration_seconds = duration.total_seconds()
                hours, remainder = divmod(duration_seconds, 3600)
                minutes, seconds = divmod(remainder, 60)
                duration_str = f"{int(hours)}小时{int(minutes)}分{int(seconds)}秒"
                # 格式化时间范围
                start_str = self.disconnect_start.strftime("%Y年%m月%d日%H:%M:%S")
                end_str = recover_time.strftime("%Y年%m月%d日%H:%M:%S")
                # 记录事件
                self.disconnect_count += 1
                self.disconnect_events.append({
                    'start': self.disconnect_start,
                    'end': recover_time,
                    'duration': duration,
                    'domain': domain
                })
                # 更新界面
                self.disconnect_count_var.set(str(self.disconnect_count))
                self.status_var.set(f"监控中 (网络正常)")
                self.status_label.config(foreground="green")
                self.status_bar_var.set(f"网络恢复,断网时长: {duration_str}")
                # 记录日志
                log_message = f"【断网恢复】{end_str} - 目标: {domain} - 断网时长: {duration_str}"
                self.log_message(log_message)
                # 更新记录显示
                self.update_record_display()
        # 定时执行下一次检测
        self.timer = threading.Timer(interval, self.check_network)
        self.timer.start()
    def log_message(self, content):
        """将信息写入日志文件,并处理日期变更"""
        # 检查日期是否变更
        today = datetime.datetime.now().strftime('%Y%m%d')
        if today != self.current_log_date:
            # 日期变更,创建新日志文件
            self.current_log_date = today
            self.log_filename = f"network_log_{today}.txt"
            self.update_log_path()  # 更新界面显示的日志路径
            # 在新文件中添加日期变更标记
            try:
                with open(self.log_filename, "a", encoding="utf-8") as f:
                    f.write(f"=== 日志日期已变更至 {today} ===\n")
            except Exception:
                pass  # 如果创建新日志失败,继续尝试写入
        # 写入日志内容
        try:
            with open(self.log_filename, "a", encoding="utf-8") as f:
                timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                f.write(f"[{timestamp}] {content}\n")
        except Exception as e:
            messagebox.showerror("日志错误", f"写入日志失败: {str(e)}")
    def update_record_display(self):
        """更新断网记录显示"""
        # 启用文本区域进行编辑
        self.record_text.config(state=tk.NORMAL)
        self.record_text.delete(1.0, tk.END)
        if not self.disconnect_events:
            self.record_text.insert(tk.END, "暂无断网记录")
            self.record_text.config(state=tk.DISABLED)
            return
        # 添加表头
        header = "序号 | 开始时间                | 结束时间                | 持续时间       | 目标\n"
        separator = "-" * 80 + "\n"
        self.record_text.insert(tk.END, header)
        self.record_text.insert(tk.END, separator)
        # 添加记录
        for idx, event in enumerate(reversed(self.disconnect_events), 1):
            start_str = event['start'].strftime("%Y-%m-%d %H:%M:%S")
            end_str = event['end'].strftime("%Y-%m-%d %H:%M:%S")
            # 计算持续时间
            duration = event['duration']
            hours, remainder = divmod(duration.total_seconds(), 3600)
            minutes, seconds = divmod(remainder, 60)
            duration_str = f"{int(hours)}h {int(minutes)}m {int(seconds)}s"
            # 格式化行
            line = f"{idx:4d} | {start_str} | {end_str} | {duration_str:>10} | {event['domain']}\n"
            self.record_text.insert(tk.END, line)
        # 禁用文本区域防止用户编辑
        self.record_text.config(state=tk.DISABLED)
        # 更新分页控件
        self.update_pagination()
    def update_pagination(self):
        """更新分页控件状态"""
        # 当前实现显示所有记录,后续可扩展为真实分页
        self.page_spin.config(to=1)
        self.page_var.set(1)
        self.total_pages_var.set("/ 1")
    def prev_page(self):
        """上一页"""
        current_page = self.page_var.get()
        if current_page > 1:
            self.page_var.set(current_page - 1)
            # 这里可以添加加载上一页数据的逻辑
    def next_page(self):
        """下一页"""
        current_page = self.page_var.get()
        total_pages = 1  # 目前只有一页
        if current_page

断网, 日志

lieren   

非常好用的软件,感谢楼主,有个小建议能不能改良下,我工作中要访问多个IP,想多个地址一同监测!爱你么么哒!
LY6322   

感谢,最近网吧断网断的头都大了
帽子是绿色的   

这工具正好可以用得上。
hwenhua3454   

谢谢,刚好可以用到
aqax   

谢谢分享,很有用。
kp666
OP
  


lieren 发表于 2025-9-2 23:15
非常好用的软件,感谢楼主,有个小建议能不能改良下,我工作中要访问多个IP,想多个地址一同监测!爱你么么 ...

等下一版,优化一下
kp666
OP
  


liyonglin0119 发表于 2025-9-3 06:08
这个能检测到WiFi断网然后记录吗?

是的,目的就是这样子,前提链接这个wifi
zz9910199   

先收藏了,感觉用得上
loveskyliao   

感谢分享 ,收藏备用!!!
您需要登录后才可以回帖 登录 | 立即注册

返回顶部