当前位置: 代码网 > it编程>前端脚本>Python > 基于Python编写简单的网络测试工具

基于Python编写简单的网络测试工具

2025年02月13日 Python 我要评论
工具介绍这是一个功能完整的网络测速工具,可以测试网络的下载速度、上传速度和延迟。功能特点1. 速度测试下载速度测试上传速度测试ping延迟测试自动选择最佳服务器2. 实时显示进度条显示测试进度实时显示

工具介绍

这是一个功能完整的网络测速工具,可以测试网络的下载速度、上传速度和延迟。

功能特点

1. 速度测试

  • 下载速度测试
  • 上传速度测试
  • ping延迟测试
  • 自动选择最佳服务器

2. 实时显示

  • 进度条显示测试进度
  • 实时显示测试状态
  • 清晰的数据展示

3. 历史记录

  • 保存测试历史
  • 显示最近6次测试结果
  • 支持导出历史记录

使用要求

python 3.6+

需要安装的库:

python -m pip install speedtest-cli

使用方法

1. 安装依赖:

  • 首先安装必要的库
  • 确保网络连接正常

2. 开始测速:

  • 点击"开始测速"按钮
  • 等待测试完成(约1-2分钟)
  • 查看测试结果

3. 历史记录:

  • 自动保存每次测试结果
  • 查看最近的测试历史
  • 可导出完整历史记录

完整代码

import tkinter as tk
from tkinter import ttk, messagebox
try:
    import speedtest
except importerror:
    messagebox.showerror("错误", "请先安装 speedtest-cli:\npip install speedtest-cli")
    raise
import threading
import time
from datetime import datetime
import json
import os
from pathlib import path
 
class networkspeedtest:
    def __init__(self):
        self.window = tk.tk()
        self.window.title("网络测速工具")
        self.window.geometry("600x500")
        
        # 创建主框架
        self.main_frame = ttk.frame(self.window, padding="10")
        self.main_frame.grid(row=0, column=0, sticky=(tk.w, tk.e, tk.n, tk.s))
        
        # 测速结果显示
        self.setup_display()
        
        # 控制按钮
        self.setup_controls()
        
        # 历史记录
        self.setup_history()
        
        # 初始化speedtest
        self.st = none
        self.testing = false
        self.history_file = path.home() / '.speedtest_history.json'
        self.load_history()
        
    def setup_display(self):
        # 当前速度显示
        display_frame = ttk.labelframe(self.main_frame, text="测速结果", padding="10")
        display_frame.grid(row=0, column=0, sticky=(tk.w, tk.e), pady=10)
        
        # 下载速度
        ttk.label(display_frame, text="下载速度:").grid(row=0, column=0, pady=5)
        self.download_speed = ttk.label(display_frame, text="-- mbps")
        self.download_speed.grid(row=0, column=1, padx=20)
        
        # 上传速度
        ttk.label(display_frame, text="上传速度:").grid(row=1, column=0, pady=5)
        self.upload_speed = ttk.label(display_frame, text="-- mbps")
        self.upload_speed.grid(row=1, column=1, padx=20)
        
        # ping值
        ttk.label(display_frame, text="ping延迟:").grid(row=2, column=0, pady=5)
        self.ping = ttk.label(display_frame, text="-- ms")
        self.ping.grid(row=2, column=1, padx=20)
        
        # 服务器信息
        ttk.label(display_frame, text="测速服务器:").grid(row=3, column=0, pady=5)
        self.server_info = ttk.label(display_frame, text="--")
        self.server_info.grid(row=3, column=1, padx=20)
        
        # 进度条
        self.progress = ttk.progressbar(display_frame, length=300, mode='determinate')
        self.progress.grid(row=4, column=0, columnspan=2, pady=10)
        
        # 状态标签
        self.status = ttk.label(display_frame, text="就绪")
        self.status.grid(row=5, column=0, columnspan=2)
        
    def setup_controls(self):
        control_frame = ttk.frame(self.main_frame)
        control_frame.grid(row=1, column=0, pady=10)
        
        self.start_button = ttk.button(control_frame, text="开始测速", command=self.start_test)
        self.start_button.grid(row=0, column=0, padx=5)
        
        ttk.button(control_frame, text="导出历史", command=self.export_history).grid(row=0, column=1, padx=5)
        
    def setup_history(self):
        history_frame = ttk.labelframe(self.main_frame, text="历史记录", padding="10")
        history_frame.grid(row=2, column=0, sticky=(tk.w, tk.e), pady=10)
        
        # 创建表格
        columns = ('time', 'download', 'upload', 'ping')
        self.history_tree = ttk.treeview(history_frame, columns=columns, height=6)
        
        self.history_tree.heading('time', text='时间')
        self.history_tree.heading('download', text='下载(mbps)')
        self.history_tree.heading('upload', text='上传(mbps)')
        self.history_tree.heading('ping', text='ping(ms)')
        
        self.history_tree.column('#0', width=0, stretch=tk.no)
        self.history_tree.column('time', width=150)
        self.history_tree.column('download', width=100)
        self.history_tree.column('upload', width=100)
        self.history_tree.column('ping', width=100)
        
        self.history_tree.grid(row=0, column=0)
        
    def load_history(self):
        if self.history_file.exists():
            try:
                with open(self.history_file, 'r') as f:
                    self.history = json.load(f)
                self.update_history_display()
            except:
                self.history = []
        else:
            self.history = []
            
    def save_history(self):
        with open(self.history_file, 'w') as f:
            json.dump(self.history, f)
            
    def update_history_display(self):
        for item in self.history_tree.get_children():
            self.history_tree.delete(item)
            
        for record in self.history[-6:]:  # 只显示最近6条记录
            self.history_tree.insert('', 0, values=(
                record['time'],
                f"{record['download']:.1f}",
                f"{record['upload']:.1f}",
                f"{record['ping']:.0f}"
            ))
            
    def start_test(self):
        if self.testing:
            return
            
        self.testing = true
        self.start_button['state'] = 'disabled'
        self.progress['value'] = 0
        self.status['text'] = "正在初始化..."
        
        # 在新线程中运行测速
        threading.thread(target=self.run_speedtest, daemon=true).start()
        
    def run_speedtest(self):
        try:
            # 初始化
            self.status['text'] = "正在连接到测速服务器..."
            self.st = speedtest.speedtest()
            self.progress['value'] = 20
            
            # 选择服务器
            self.status['text'] = "正在选择最佳服务器..."
            server = self.st.get_best_server()
            self.server_info['text'] = f"{server['sponsor']} ({server['name']})"
            self.progress['value'] = 40
            
            # 测试下载速度
            self.status['text'] = "正在测试下载速度..."
            download_speed = self.st.download() / 1_000_000  # 转换为mbps
            self.download_speed['text'] = f"{download_speed:.1f} mbps"
            self.progress['value'] = 60
            
            # 测试上传速度
            self.status['text'] = "正在测试上传速度..."
            upload_speed = self.st.upload() / 1_000_000  # 转换为mbps
            self.upload_speed['text'] = f"{upload_speed:.1f} mbps"
            self.progress['value'] = 80
            
            # 获取ping值
            ping_time = server['latency']
            self.ping['text'] = f"{ping_time:.0f} ms"
            self.progress['value'] = 100
            
            # 保存结果
            self.history.append({
                'time': datetime.now().strftime("%y-%m-%d %h:%m:%s"),
                'download': download_speed,
                'upload': upload_speed,
                'ping': ping_time
            })
            self.save_history()
            self.update_history_display()
            
            self.status['text'] = "测速完成"
            
        except exception as e:
            messagebox.showerror("错误", f"测速过程中出错:{str(e)}")
            self.status['text'] = "测速失败"
            
        finally:
            self.testing = false
            self.start_button['state'] = 'normal'
            
    def export_history(self):
        if not self.history:
            messagebox.showinfo("提示", "没有历史记录可供导出")
            return
            
        file_path = tk.filedialog.asksaveasfilename(
            defaultextension=".csv",
            filetypes=[("csv files", "*.csv")],
            initialfile="speedtest_history.csv"
        )
        
        if file_path:
            try:
                with open(file_path, 'w', encoding='utf-8') as f:
                    f.write("时间,下载速度(mbps),上传速度(mbps),ping延迟(ms)\n")
                    for record in self.history:
                        f.write(f"{record['time']},{record['download']:.1f},"
                               f"{record['upload']:.1f},{record['ping']:.0f}\n")
                messagebox.showinfo("成功", "历史记录已导出")
            except exception as e:
                messagebox.showerror("错误", f"导出过程中出错:{str(e)}")
                
    def run(self):
        self.window.mainloop()
 
if __name__ == "__main__":
    app = networkspeedtest()
    app.run() 

效果图

以上就是基于python编写简单的网络测试工具的详细内容,更多关于python网络测试的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com