【免费第一个】利用OpenAI写的Python小程序【网络检测小工具】

本文介绍了一个用Python编写的网络工具应用,主要功能包括通过Tkinter界面输入IP地址进行Ping测试和Tracert追踪,支持设置包大小、次数,结果实时显示并可导出至文件。
摘要由CSDN通过智能技术生成
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()
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GG丶亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值