基于Python编写简单的网络测试工具!
基于Python编写简单的网络测试工具!
作者:mosquito_lover1
这篇文章主要为大家详细介绍了如何基于Python编写一个简单的网络测试工具,可以测试网络的下载速度,上传速度和延迟,感兴趣的可以了解下.
工具介绍
这是一个功能完整的网络测速工具,可以测试网络的下载速度、上传速度和延迟。
功能特点
1. 速度测试
- 下载速度测试
- 上传速度测试
- Ping延迟测试
- 自动选择最佳服务器
2. 实时显示
- 进度条显示测试进度
- 实时显示测试状态
- 清晰的数据展示
3. 历史记录
- 保存测试历史
- 显示最近6次测试结果
- 支持导出历史记录
使用要求
Python 3.6+
需要安装的库:
| 1 | python -m pip install speedtest-cli | 
使用方法
1. 安装依赖:
- 首先安装必要的库
- 确保网络连接正常
2. 开始测速:
- 点击"开始测速"按钮
- 等待测试完成(约1-2分钟)
- 查看测试结果
3. 历史记录:
- 自动保存每次测试结果
- 查看最近的测试历史
- 可导出完整历史记录
完整代码
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 | importtkinter as tkfromtkinter importttk, messageboxtry:importspeedtestexceptImportError:messagebox.showerror("错误", "请先安装 speedtest-cli:\npip install speedtest-cli")raiseimportthreadingimporttimefromdatetime importdatetimeimportjsonimportosfrompathlib importPathclassNetworkSpeedTest: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()defsetup_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)defsetup_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)defsetup_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)defload_history(self):ifself.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 =[]defsave_history(self):with open(self.history_file, 'w') as f:json.dump(self.history, f)defupdate_history_display(self):foritem inself.history_tree.get_children():self.history_tree.delete(item)forrecord inself.history[-6:]:  # 只显示最近6条记录self.history_tree.insert('', 0, values=(record['time'],f"{record['download']:.1f}",f"{record['upload']:.1f}",f"{record['ping']:.0f}"))defstart_test(self):ifself.testing:returnself.testing =Trueself.start_button['state'] ='disabled'self.progress['value'] =0self.status['text'] ="正在初始化..."# 在新线程中运行测速threading.Thread(target=self.run_speedtest, daemon=True).start()defrun_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'] ="测速完成"exceptException as e:messagebox.showerror("错误", f"测速过程中出错:{str(e)}")self.status['text'] ="测速失败"finally:self.testing =Falseself.start_button['state'] ='normal'defexport_history(self):ifnotself.history:messagebox.showinfo("提示", "没有历史记录可供导出")returnfile_path =tk.filedialog.asksaveasfilename(defaultextension=".csv",filetypes=[("CSV files", "*.csv")],initialfile="speedtest_history.csv")iffile_path:try:with open(file_path, 'w', encoding='utf-8') as f:f.write("时间,下载速度(Mbps),上传速度(Mbps),Ping延迟(ms)\n")forrecord inself.history:f.write(f"{record['time']},{record['download']:.1f},"f"{record['upload']:.1f},{record['ping']:.0f}\n")messagebox.showinfo("成功", "历史记录已导出")exceptException as e:messagebox.showerror("错误", f"导出过程中出错:{str(e)}")defrun(self):self.window.mainloop()if__name__ =="__main__":app =NetworkSpeedTest()app.run() | 
效果图

以上就是基于Python编写简单的网络测试工具的详细内容。
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需129元,即可下载本站文章涉及的文件和软件。
