import tkinter as tk
from tkinter import filedialog, messagebox
import subprocess
import threading
class NetworkToolApp:
def __init__(self, master):
self.master = master
self.master.title('网络小工具--GG丶亮')
self.create_widgets()
def create_widgets(self):
self.ip_frame = tk.Frame(self.master)
self.ip_frame.grid(row=0, column=0, columnspan=2, sticky='w')
self.host_label = tk.Label(self.ip_frame, text='IP地址:')
self.host_label.pack(side=tk.LEFT)
self.host_entry = tk.Entry(self.ip_frame,width=16)
self.host_entry.pack(side=tk.LEFT)
self.clear_host_button = tk.Button(self.ip_frame, text="清空", command=self.clear_host)
self.clear_host_button.pack(side=tk.LEFT, padx=5)
self.packet_size_label = tk.Label(self.ip_frame, text='Ping包大小(1-65500):')
self.packet_size_label.pack(side=tk.LEFT)
self.packet_size_var = tk.StringVar()
self.packet_size_var.set("32")
self.packet_size_entry = tk.Entry(self.ip_frame, textvariable=self.packet_size_var, validate="key",width=7)
self.packet_size_entry['validatecommand'] = (self.packet_size_entry.register(self.validate_packet_size), '%P')
self.packet_size_entry.pack(side=tk.LEFT)
self.ping_count_label = tk.Label(self.ip_frame, text='Ping次数:')
self.ping_count_label.pack(side=tk.LEFT)
self.ping_count_var = tk.IntVar()
self.ping_count_var.set(4)
self.ping_count_entry = tk.Entry(self.ip_frame, textvariable=self.ping_count_var,width=8)
self.ping_count_entry.pack(side=tk.LEFT)
self.warning_frame = tk.Frame(self.master)
self.warning_frame.grid(row=1, column=0, columnspan=2, sticky='w')
self.clear_host_info_label = tk.Label(self.warning_frame, text='点击【停止Ping】会重新启用【开始Ping】按钮', fg='red')
self.clear_host_info_label.pack()
self.button_frame = tk.Frame(self.master)
self.button_frame.grid(row=4, column=0, columnspan=2, sticky='w')
self.start_ping_button = tk.Button(self.button_frame, text='开始Ping', command=self.start_ping, state='normal')
self.start_ping_button.pack(side=tk.LEFT)
self.stop_ping_button = tk.Button(self.button_frame, text='停止Ping', command=self.stop_ping, state='disabled')
self.stop_ping_button.pack(side=tk.LEFT, padx=5)
self.start_tracert_button = tk.Button(self.button_frame, text='Tracert', command=self.start_tracert)
self.start_tracert_button.pack(side=tk.LEFT)
self.save_button = tk.Button(self.button_frame, text='将结果导出', command=self.save_to_file)
self.save_button.pack(side=tk.LEFT, padx=5)
self.result_text = tk.Text(self.master, height=24, width=70)
self.result_text.grid(row=5, column=0, columnspan=2, sticky='w')
self.result_scrollbar = tk.Scrollbar(self.master, orient=tk.VERTICAL, command=self.result_text.yview)
self.result_scrollbar.grid(row=5, column=2, sticky='ns')
self.result_text.config(yscrollcommand=self.result_scrollbar.set)
def validate_packet_size(self, value):
if value.isdigit():
packet_size = int(value)
if 1 <= packet_size <= 65500:
return True
return False
def start_ping(self):
self.start_ping_button.config(state='disabled')
self.stop_ping_button.config(state='normal')
self.ping_thread_stop_event = threading.Event()
target_host = self.host_entry.get()
packet_size = self.packet_size_var.get()
packet_count = self.ping_count_var.get() # 获取ping次数
self.result_text.config(state='normal')
startup_info = subprocess.STARTUPINFO()
startup_info.dwFlags |= subprocess.STARTF_USESHOWWINDOW
if packet_size and packet_size.isdigit() and 1 <= int(packet_size) <= 65500:
command = f'ping -n {packet_count} -l {packet_size} {target_host}'
else:
command = f'ping -n {packet_count} {target_host}'
self.ping_process = subprocess.Popen(command, stdout=subprocess.PIPE, text=True, bufsize=1, startupinfo=startup_info)
self.ping_thread = threading.Thread(target=self.update_ping_results, args=(self.ping_thread_stop_event,))
self.ping_thread.start()
def update_ping_results(self, stop_event):
for line in self.ping_process.stdout:
if stop_event.is_set():
break
self.result_text.insert(tk.END, line)
self.result_text.see(tk.END) # 将滚动条调整到文本的最新位置
def update_tracert_results(self, stop_event):
for line in self.tracert_process.stdout:
if stop_event.is_set():
break
self.result_text.insert(tk.END, line)
self.result_text.see(tk.END) # 将滚动条调整到文本的最新位置
def stop_ping(self):
if self.ping_process:
self.ping_process.terminate()
self.start_ping_button.config(state='normal')
self.stop_ping_button.config(state='disabled')
def start_tracert(self):
self.start_tracert_button.config(state='normal')
target_host = self.host_entry.get()
self.result_text.config(state='normal')
startup_info = subprocess.STARTUPINFO()
startup_info.dwFlags |= subprocess.STARTF_USESHOWWINDOW
self.tracert_process = subprocess.Popen(['tracert', target_host], stdout=subprocess.PIPE, text=True, bufsize=1, startupinfo=startup_info)
self.tracert_thread_stop_event = threading.Event()
self.tracert_thread = threading.Thread(target=self.update_tracert_results, args=(self.tracert_thread_stop_event,))
self.tracert_thread.start()
def clear_host(self):
self.host_entry.delete(0, tk.END)
self.start_ping_button.config(state='normal')
def save_to_file(self):
file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("纯文本(txt)", "*.txt")], initialfile="网络测试.txt")
if file_path:
try:
with open(file_path, 'w') as file:
file.write(self.result_text.get(1.0, tk.END))
messagebox.showinfo('保存成功', '文件成功保存')
except Exception as e:
messagebox.showerror('保存出错', str(e))
if __name__ == "__main__":
window = tk.Tk()
app = NetworkToolApp(window)
window.geometry("515x403")
window.mainloop()
【免费第一个】利用OpenAI写的Python小程序【网络检测小工具】
于 2024-01-17 21:19:14 首次发布
本文介绍了一个用Python编写的网络工具应用,主要功能包括通过Tkinter界面输入IP地址进行Ping测试和Tracert追踪,支持设置包大小、次数,结果实时显示并可导出至文件。
摘要由CSDN通过智能技术生成