From ee6a4269e0cfef65d07f3084be4b8ecf0dbd243a Mon Sep 17 00:00:00 2001 From: qsc20001102 Date: Mon, 3 Nov 2025 10:20:00 +0800 Subject: [PATCH] 12 --- .../__pycache__/ping_fun.cpython-313.pyc | Bin 10252 -> 10274 bytes .../__pycache__/tracert_fun.cpython-313.pyc | Bin 0 -> 4714 bytes core/Function/ping_fun.py | 3 +- core/Function/tracert_fun.py | 84 ++++++++++++++++++ .../__pycache__/tab_tracert.cpython-313.pyc | Bin 0 -> 3612 bytes core/ui/__pycache__/ui_main.cpython-313.pyc | Bin 1845 -> 1967 bytes core/ui/tab_tracert.py | 56 ++++++++++++ core/ui/ui_main.py | 4 +- 8 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 core/Function/__pycache__/tracert_fun.cpython-313.pyc create mode 100644 core/Function/tracert_fun.py create mode 100644 core/ui/__pycache__/tab_tracert.cpython-313.pyc create mode 100644 core/ui/tab_tracert.py diff --git a/core/Function/__pycache__/ping_fun.cpython-313.pyc b/core/Function/__pycache__/ping_fun.cpython-313.pyc index 53400041e01a3825d896c32642aad14d7f18e3f7..95a4016a3758d71961e952a18fad37259b98d4ee 100644 GIT binary patch delta 131 zcmeAPSQNnfnU|M~0SI>SaAdY^%t$`TBOlb^|zGO|vNkq>2Ln_MFoGnr4pnVBV> zWpapuxj1{NAW+BCo!g%FPkh$7^JRO#LO^C-`s7{(Nk+fT%M@Z68J}!sQ98@aIDPXa e)h5muS6I+GLC=kSLxF{*rG0Fgz)Kr;YXS||zt delta 133 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 blyeW6?;*?I(ZYY~-lV9l)b~jFC<6Ws#mwr3 literal 0 HcmV?d00001 diff --git a/core/Function/ping_fun.py b/core/Function/ping_fun.py index 9534d96..865bf77 100644 --- a/core/Function/ping_fun.py +++ b/core/Function/ping_fun.py @@ -53,7 +53,7 @@ class PingFun: stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, - creationflags=creationflags # ✅ 加上这个! + creationflags=creationflags ) for line in iter(self.process.stdout.readline, ''): if self.stop_flag: @@ -127,6 +127,7 @@ class PingFun: return f"{ip} 错误: {e}\n" def _concurrent_batch_ping(self, net_prefix, start, end, local_ip=None): + '''并发批量 Ping''' ip_list = [f"{net_prefix}{i}" for i in range(start, end + 1)] max_workers = min(50, len(ip_list)) with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: diff --git a/core/Function/tracert_fun.py b/core/Function/tracert_fun.py new file mode 100644 index 0000000..43b6ea9 --- /dev/null +++ b/core/Function/tracert_fun.py @@ -0,0 +1,84 @@ +import subprocess +import threading +import tkinter as tk +from tkinter import scrolledtext, messagebox + + +class TracertFun: + def __init__(self, result_box: scrolledtext.ScrolledText): + self.result_box = result_box + self.process = None + self.stop_flag = False + + def _append_text(self, text: str): + """线程安全地输出到文本框""" + self.result_box.after(0, lambda: ( + self.result_box.insert(tk.END, text), + self.result_box.see(tk.END) + )) + + def start_tracert(self, target: str): + """开始追踪""" + if self.process: + messagebox.showwarning("警告", "⚠️ 正在运行,请先停止再启动。") + return + + if not target.strip(): + messagebox.showwarning("提示", "请输入目标地址!") + return + + cmd = f'tracert -d -w 500 -h 20 {target}' + self.stop_flag = False + + self._append_text(f"\n=== 开始追踪 {target} ===\n\n") + + thread = threading.Thread(target=self._run_tracert, args=(cmd,)) + thread.daemon = True + thread.start() + + def _run_tracert(self, cmd: str): + """执行 tracert 命令""" + try: + self.process = subprocess.Popen( + cmd, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + creationflags=subprocess.CREATE_NO_WINDOW # 隐藏控制台窗口 + ) + + for line in self.process.stdout: + if self.stop_flag: + break + self._append_text(line) + + except Exception as e: + self._append_text(f"\n❌ 错误: {e}\n") + + finally: + # 安全关闭进程 + if self.process: + try: + self.process.terminate() + except Exception: + pass + self.process = None + + if self.stop_flag: + self._append_text("\n=== 已停止追踪 ===\n") + else: + self._append_text("\n--- 追踪结束 ---\n") + + def stop_tracert(self): + """停止追踪""" + if self.process: + self.stop_flag = True + try: + self.process.terminate() + except Exception: + pass + self.process = None + self._append_text("\n=== 已手动停止追踪 ===\n") + else: + messagebox.showinfo("提示", "当前没有正在运行的追踪任务。") diff --git a/core/ui/__pycache__/tab_tracert.cpython-313.pyc b/core/ui/__pycache__/tab_tracert.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..221f4cdc83debe1b438d5c6282bbb4aec14f8f09 GIT binary patch literal 3612 zcmb^!TTC3+_0H_f?(DL#yC%4>cJV^McoTKwK-`$Lb{i*g6i89az!&R|hTUPAFzk>! zvjJCaMHIEcs->h!tWd>?aHPs6Qe)bmT50>+2%~MkpcaCnQ2X#Sec3J!JDOKrRrO$Xq|69L#(_>EkKi7odSY zfeL*h6;ntL^auMwH00nyztk6|VF%~>BQ%nY4DRUV z2M=!V^092_nBeV=6}WV$iXQ`Mfdy=Pf`0IgQ$8f}?dEBpu$mZAcxhqTX}hWKG}MkHjI^Hr51!(ZTo)9xNVr(t4j@hOlrH;@i8(JD=8 zlu3%B7j;`vSj2YKq?B}uyjX;4R>`mxRBxS694i&m0VY_QF~)*ZD%FZM3oA;_P%TSQ zEPP-pHOn4;=85dHx}6=+>}iuue9JaX!^-ANs%1-h)>cOqk6~u&EN#Hs8a*q4-ZH*S zbwIEl2JqD^xh2(~3st1%`TfgMYE6p17CRSPmRfEd=v>HOHZPes4}5!0Sdp4HVLQor z-iEkiXOwI6X#f{cskKzx0b^UKK*!y?#x@;%k}ov^*?Ym~7tUATeSiJhE9<|X9Z2)6 zIY%|s))ZT%1AAILyhC9EQJ$Tqj3+gW!T*R0E9+qGfjtI8hJ# z8{`lc^S-<@6Ln1Ja7GLJdMxEYF4S22uQ37Ak->y1H9zCPvn76l8YcP>04BPpLOFACQZ44)V=rI4{k!+QV<eGfq==5~QC} za}z9#KB^bNC0W9i!gn_yun1B|OSTOTyx%8S;M}&7Qw?JjIV6DY2ejhQSkv}ab835M zeCJMcYLR!mpNV5Ak%f|`yeMcvaUUFVvl6C-`vn%39BUE4Ecqt8f+*MZaw!7A6diCQ;7@Pfe(&POU*24Q^&{E}$7u>d8v=|X+K%8s0M$GK zv~`-NkHEx&(VVY#AdmU(J z{yl`pegvS#d#+?E@!q|i=dVhL^|wJGWL`E%7bK3sq2y^W<;SinzOX!u|Jw))m@Hm+WE zj%-~0qq|m{8vp(A%g~8XEUhd6wUXkyS)Da*PEV_}s22+~fh+ZHy74j!xCy3f7IX{j z4vRmIgti)sduQCFw3UX?uPp5Ppok`#Ruf&7MAsFulE|zkx+{t9n~BHfg8z&)-HPsC zjke#2wlAD4_xxZvI=!wWC1NSS->jJkI0d>oMb+4<`%4BEyv z!_jt4Ca={t^ct>uq85}VKmF1J_%^H)UKZ^IbVm?utE46|W8hg20Pxxh_l4M8tVmtX z`_dxC$IvGbpvl~zLj$Fw*hUs1e`6b|D3fNsWFQ_@lov~?;Zb6WGNx0@HuR!aG!@0^ z`epsSbrhgAS9`d(CD}GYmz6B!N;p5B|Q}JYmkF z2=L!RQ-AeK@&z9dAHN$B#Lm0Xka&u}yDumnz8epUk9-;D#UpnJ0Oy&`$#k5B>+7;`+-O+ayMW-}!{Gm1YnuxZ8=&RU#h{HcL0U&dE9w9Rf)9fBV&1@LSZ z28VwhaE;OdJQzd*+$TDv*%4!rxFTUs$fWPOYCTEMz$Y5mLN(n9a2)q{^1#2yiJRoa wI_dZaIr=GSSPREj!^s=r6d5q1BOwr<#ZJFdIzhvSTWC>-+;eja)WeAd(?98k-S({m# zQFd}Ta||QPSz7^r67S9+t)vzvhl_Ky)SmG0y=@EB(40S;pccC#xt|2TKp<2foS4tY+MzKwU*rAVOyH5>^{V<;f3OW%X4-0!knP*b;4^2*gm3#kV+Ya`RJ4b5iY!%z#`_6cyV5i4V+- rjEuJ#MD8=_Uu4jK%Aj%=gf#9lFltTaW0&9;Vl?as|H=TQz-9peh_-?P delta 423 zcmZ3_zm<>oGcPX}0}y!JX3KP*$ScV>X`*@vC!;rS5pN7{kj%shqN@C+j35;Z3`GJG z3`z{a>{1ND95HOB%urFmbVg0iiKoIQ>oM9h@=VTSlw{=E+`-t)s1eMr#~jL#!wpf$ zz!1t1BnD$6=pf0-3z>u`=P_$dj$#&`yqejIk$LhrW<_ODpql5a*FWuF{H$~Jv;O{P zb9$e4Ed+{aGTve-Nv$Z+a8fbu5W)) z-~O_y!$)=&QLYY_9?lOulMk?(af<-e6-j~!>B)?2HjGM>?bu}XRX_rYAOhrKFu?<4 z6te?~HioZE0<4BbU^O6VO`*wMY;}{B*hNfLf!tecIr-`7sYMX2T0jwqQjl@CIBatB zQ%ZAE?TSo*Tu^8hTTaeqmsNSpz;}aF;5w(&B~Gas7MD3y8rZ(D2r?RWgnwlKQeYzh Dms?=X diff --git a/core/ui/tab_tracert.py b/core/ui/tab_tracert.py new file mode 100644 index 0000000..81be0d4 --- /dev/null +++ b/core/ui/tab_tracert.py @@ -0,0 +1,56 @@ +import tkinter as tk +from tkinter import ttk, filedialog, messagebox, scrolledtext + +from core.ui.basic_ui import BasicUI +from core.Function.tracert_fun import TracertFun + +import logging +logger = logging.getLogger(__name__) + +class TracertTab(ttk.Frame, BasicUI): + def __init__(self, parent): + super().__init__(parent) + self.tracert_ui() + self.tracert_fun = TracertFun(self.result_box) + + def tracert_ui(self): + """tracert界面布局""" + self.create_targetadd_section() + + self.create_output_section() +# --------------------------------------UI界面布局函数-------------------------------------- + def create_targetadd_section(self): + # 区域标签 + frame = ttk.LabelFrame(self, text="追踪目标地址") + frame.pack(side='top', fill='x', padx=10, pady=5) + + self.entry_tracert_add = self.add_input(frame, "目标地址", row=0, col=0, entry_width=40, inivar="202.89.233.100") + self.but_tracert_start = self.add_button(frame, "开始追踪", row=0, col=1, width=8, command=self.tracert_start_callback) + self.but_tracert_stop = self.add_button(frame, "停止追踪", row=0, col=2, width=8, command=self.tracert_stop_callback) + + def create_output_section(self): + # 区域标签 + frame = ttk.LabelFrame(self, text="结果输出") + frame.pack(side='top', fill='x', padx=10, pady=5) + + self.result_box = scrolledtext.ScrolledText(frame, width=100, height=25) + self.result_box.pack(pady=10) +# --------------------------------------按钮回调函数-------------------------------------- + def tracert_start_callback(self): + """开始追踪按钮回调""" + target = self.entry_tracert_add['var'].get() + if not target: + messagebox.showwarning("输入错误", "请输入目标地址!") + return + self.tracert_fun.start_tracert(target) + + def tracert_stop_callback(self): + """停止追踪按钮回调""" + self.tracert_fun.stop_tracert() + + + + + + + \ No newline at end of file diff --git a/core/ui/ui_main.py b/core/ui/ui_main.py index 0d4d24f..eb20deb 100644 --- a/core/ui/ui_main.py +++ b/core/ui/ui_main.py @@ -5,6 +5,7 @@ from core.ui.basic_ui import BasicUI from core.ui.tab_ping import PingTab from core.ui.tab_telnet import TelnetTab from core.ui.tab_network import NetworkTab +from core.ui.tab_tracert import TracertTab import logging logger = logging.getLogger(__name__) @@ -22,7 +23,8 @@ class MainUI(BasicUI): self.tabs = { "网卡设置": NetworkTab(self.tab_control), "Ping测试": PingTab(self.tab_control), - "端口扫描服务端": TelnetTab(self.tab_control), + "端口扫描": TelnetTab(self.tab_control), + "路由追踪": TracertTab(self.tab_control), } # 添加到 Notebook for name, tab in self.tabs.items():