当前位置: 首页 > news >正文

网络测试工具

工具介绍:

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

功能特点:

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 Pathclass 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()# 初始化speedtestself.st = Noneself.testing = Falseself.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:returnself.testing = Trueself.start_button['state'] = 'disabled'self.progress['value'] = 0self.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  # 转换为Mbpsself.download_speed['text'] = f"{download_speed:.1f} Mbps"self.progress['value'] = 60# 测试上传速度self.status['text'] = "正在测试上传速度..."upload_speed = self.st.upload() / 1_000_000  # 转换为Mbpsself.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 = Falseself.start_button['state'] = 'normal'def export_history(self):if not self.history:messagebox.showinfo("提示", "没有历史记录可供导出")returnfile_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() 

相关文章:

网络测试工具

工具介绍: 这是一个功能完整的网络测速工具,可以测试网络的下载速度、上传速度和延迟。 功能特点: 1. 速度测试 - 下载速度测试 - 上传速度测试 - Ping延迟测试 - 自动选择最佳服务器 2. 实时显示 - 进度条显示测试进度 - 实时显示测试状…...

使用HttpClient和HttpRequest发送HTTP请求

项目中经常会用到向第三方系统发送请求来传递数据或者获得信息&#xff0c;一般用的比较多的为HttpClient 和 HttpRequest&#xff0c;这里简要总结一下 HttpClient 和 HttpRequest 的用法 一、HttpClient 1. 发送get请求 public static String get(String url, Map<Stri…...

软件工程概论试题五

一、多选 1.好的软件的基本属性包括()。 A. 效率 B. 可依赖性和信息安全性 C. 可维护性 D.可接受性 正答&#xff1a;ABCD 2.软件工程的三要素是什么()? A. 结构化 B. 工具 C.面向对象 D.数据流! E.方法 F.过程 正答&#xff1a;BEF 3.下面中英文术语对照哪些是正确的、且是属…...

填充每个节点的下一个右侧节点指针力扣--116,117

目录 题目 思路 代码 题目 116 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针&#xff0c…...

DBUtils中QueryRunner(空参,传数据源)构造方法的区别及应用场景

关于学习Spring框架时重构DAO层时&#xff0c;遇到的QueryRunner构造方法的问题&#xff0c;回忆MySQL中DBUtils部分 1. 空参构造方法 new QueryRunner() 特点&#xff1a; 不绑定数据源&#xff1a;QueryRunner 实例内部没有 DataSource&#xff0c;因此无法自动获取连接。 …...

STM32 TIM输入捕获 测量频率

输入捕获简介&#xff1a; IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器…...

Autosar-以太网是怎么运行的?(Davinci配置部分)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 目录 1.Autosar ETH通讯软件架构 2.Ethernet MCAL配置 2.1配置对应Pin属性 2.2配置TXD引脚 2.3配…...

16.[前端开发]Day16-HTML+CSS阶段练习(网易云音乐五)

完整代码 网易云-main-left-rank&#xff08;排行榜&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&q…...

langchain 实现多智能体多轮对话

这里写目录标题 工具定义模型选择graph节点函数定义graph 运行 工具定义 import random from typing import Annotated, Literalfrom langchain_core.tools import tool from langchain_core.tools.base import InjectedToolCallId from langgraph.prebuilt import InjectedSt…...

Java-数据结构-优先级队列(堆)

一、优先级队列 ① 什么是优先级队列&#xff1f; 在此之前&#xff0c;我们已经学习过了"队列"的相关知识&#xff0c;我们知道"队列"是一种"先进先出"的数据结构&#xff0c;我们还学习过"栈"&#xff0c;是"后进先出"的…...

C++实现状态模式

首先上代码&#xff1a; #include <iostream> #include <memory>class Context;class State { public:virtual void Handle(Context * context) 0; //纯虚函数virtual ~State() default; //虚析构函数 };//创建状态A class ConcreateStateA : public State{…...

FreeRTOS学习笔记2:FreeRTOS的基础知识

1.FreeRTOS介绍 FreeRTOS是一个免费的嵌入式实时操作系统&#xff0c;同时它在市面上也是一款主流的操作系统&#xff0c;是工作上必不可少的技能。它具有以下六种特点&#xff1a; 1.免费开源&#xff1a;在商业产品中使用&#xff0c;无潜在商业风险&#xff0c;无需担心。 2…...

计算机网络之计算机网络的分类

计算机网络可以根据不同的角度进行分类&#xff0c;以下是几种常见的分类方式&#xff1a; 1. 按照规模和范围&#xff1a; 局域网&#xff08;LAN&#xff0c;Local Area Network&#xff09;&#xff1a;覆盖较小范围&#xff08;例如一个建筑物或校园&#xff09;&#xf…...

从理论到实践:Linux 进程替换与 exec 系列函数

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 在Linux中&#xff0c;进程替换&#xff08;Process Substitution&#xff09;是一个非常强大的特性&#xff0c;它允许将一个进程的输出直接当作一个文件来处理。这种技术通常用于Shell脚本和命令行操作中…...

Flutter常用Widget小部件

小部件Widget是一个类&#xff0c;按照继承方式&#xff0c;分为无状态的StatelessWidget和有状态的StatefulWidget。 这里先创建一个简单的无状态的Text小部件。 Text文本Widget 文件&#xff1a;lib/app/app.dart。 import package:flutter/material.dart;class App exte…...

微信小程序实战0 设置

1.调节模拟器到右侧位置 2.设置编辑页面的字体和行距。...

2025开源DouyinLiveRecorder全平台直播间录制工具整合包,多直播同时录制、教学直播录制、教学视频推送、简单易用不占内存

一、DouyinLiveRecorder软件介绍&#xff08;文末提供下载&#xff09; 官方地址&#xff1a;GitHub - ihmily/DouyinLiveRecorder 本文信息来源于作者GitHub地址 一款简易的可循环值守的直播录制工具&#xff0c;基于FFmpeg实现多平台直播源录制&#xff0c;支持自定义配置录制…...

使用 postman 测试思源笔记接口

思源笔记 API 权鉴 官方文档-中文&#xff1a;https://github.com/siyuan-note/siyuan/blob/master/API_zh_CN.md 权鉴相关介绍截图&#xff1a; 对应的xxx&#xff0c;在软件中查看 如上图&#xff1a;在每次发送 API 请求时&#xff0c;需要在 Header 中添加 以下键值对&a…...

当WebGIS遇到智慧文旅-以长沙市不绕路旅游攻略为例

目录 前言 一、旅游数据组织 1、旅游景点信息 2、路线时间推荐 二、WebGIS可视化实现 1、态势标绘实现 2、相关位置展示 三、成果展示 1、第一天旅游路线 2、第二天旅游路线 3、第三天旅游路线 4、交通、订票、住宿指南 四、总结 前言 随着信息技术的飞速发展&…...

阿里最新普通x231 逆向分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向前言 12月份的时候更新了过一次…...

Qt Scene Graph渲染管线深度解析:从QML到GPU像素的奇幻之旅

揭开Qt Quick高性能渲染的黑盒&#xff0c;掌握60fps丝滑界面的核心秘密一、为什么Scene Graph是Qt Quick的灵魂&#xff1f; 当你用QML写一个流畅的动画界面&#xff0c;轻松跑到60fps&#xff0c;有没有想过背后的渲染引擎到底做了什么&#xff1f;传统的QWidget走的是CPU软件…...

打破平台壁垒:Windows上安装APK文件的完整解决方案

打破平台壁垒&#xff1a;Windows上安装APK文件的完整解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想过在Windows电脑上直接运行安卓应用&#xff…...

开源智能体技术解析:从LangChain到自主抓取,构建自动化工作流

1. 项目概述&#xff1a;从“Awesome”列表看开源智能体生态的演进 最近在梳理一些前沿的自动化工具链时&#xff0c;又翻到了 mergisi/awesome-openclaw-agents 这个仓库。对于长期关注AI Agent&#xff08;智能体&#xff09;和自动化工作流开发的同行来说&#xff0c;这类…...

模拟IC设计避坑指南:用Cadence Virtuoso仿真,揭秘电流镜精度下降的3个元凶

模拟IC设计避坑指南&#xff1a;用Cadence Virtuoso仿真&#xff0c;揭秘电流镜精度下降的3个元凶 在模拟CMOS集成电路设计中&#xff0c;电流镜作为基础模块广泛应用于偏置电路、有源负载等场景。然而许多工程师在Cadence Virtuoso IC617中完成电流镜设计后&#xff0c;常会遇…...

计算机科学第三难题:“树映射”问题在文件、写作、建筑、生物分类中无处不在!

计算机科学第三难题&#xff1a;将通用图映射到层次结构&#xff0c;“树映射”问题无处不在 根据一个归属于 菲尔卡尔顿 的 经典笑话&#xff0c;计算机科学只有两个难题&#xff1a;命名和缓存失效。这两个问题之所以难&#xff0c;是因为没有算法可以解决它们&#xff1a;好…...

终极指南:如何为PotPlayer配置百度翻译插件实现实时字幕翻译

终极指南&#xff1a;如何为PotPlayer配置百度翻译插件实现实时字幕翻译 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu PotPlayer_Sub…...

Scarab空洞骑士模组管理器:2024年最完整的安装与使用指南

Scarab空洞骑士模组管理器&#xff1a;2024年最完整的安装与使用指南 【免费下载链接】Scarab An installer for Hollow Knight mods written with Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为空洞骑士模组安装的复杂流程而烦恼吗&#xff1f…...

告别标题栏!在RK3568 Buildroot固件上,让你的Qt应用开机全屏显示的保姆级教程

RK3568嵌入式全屏实战&#xff1a;从Weston配置到Qt应用独占显示的完整指南 在嵌入式Linux系统开发中&#xff0c;GUI应用的全屏显示往往成为工程师面临的第一个"拦路虎"。当你在RK3568平台上精心开发的Qt应用启动后&#xff0c;却发现屏幕顶部顽固地挂着Weston窗口管…...

faah:轻量级自动化任务编排器,简化运维与数据处理工作流

1. 项目概述&#xff1a;一个被低估的自动化利器最近在整理自己的自动化工具链时&#xff0c;又翻出了kiron0/faah这个项目。说实话&#xff0c;第一次看到这个仓库名&#xff0c;我也有点懵——“faah”&#xff1f;这名字听起来不像是一个典型的工具。但点进去之后&#xff0…...

83.人工智能实战:RAG 表格问答怎么做?从前期发现“表格被切碎”到结构化解析、行列索引与答案校验

人工智能实战:RAG 表格问答怎么做?从前期发现“表格被切碎”到结构化解析、行列索引与答案校验 一、问题场景:Word 文档能答,Excel 表格一问就错 很多企业知识库不只有 Word 和 PDF,还有大量表格: 1. 报销标准表 2. 产品价格表 3. 客户等级表 4. SLA 服务等级表 5. 部门…...