V dnešnom príspevku by som sa s vami chcel podeliť o projekt, ktorý som nedávno vytvoril – aplikáciu pre monitorovanie siete v reálnom čase ( Monitor siete v Python GUI ). Tento nástroj je určený pre IT profesionálov, špeciálne pre členov sieťových tímov, ktorí potrebujú rýchly a efektívny prehľad o stave siete. Rozhodol som sa použiť Python, pretože ponúka vynikajúci řetec možností pre spracovanie sieťových informácií a vytváranie GUI.
Prečo som zvolil tento projekt?
Monitorovanie sieťových aktivít môže byť veľmi užitočné pri riešení problémov so zlyhaním pripojenia. Rovnako pomáha pri sledovaní, či je všetko v poriadku v sieťovej infraštruktúre. Potreboval som jednoduchý a efektívny nástroj, ktorý mi zobrazí aktuálny stav pripojenia a dátový tok, a tak vznikol tento projekt.
Použité technológie
- Python – ako hlavý programovací jazyk, kvôli svojej jednoduchosti a rozsiahlej knižnicnici na spracovanie sieťových informácií.
- Tkinter (s tmavou témou „Darkly“ z knižnicnice ttkbootstrap) – pre vytvorenie grafického rozhrania, ktoré je moderné a prehľadné.
- Matplotlib – pre generovanie reálno-časových grafov, ktoré pomáhajú lepšie vizualizovať prenosy dát a využívanie šírky pásma.
- Psutil – pre zber sieťových štatistík a dát, ktoré nám pomáhajú výrazne sledovať sieťové rozhranie.
Kľúčové funkcie aplikácie
- Monitorovanie sieťových štatistík: Zobrazuje základné informácie ako počet odoslaných a prijatých bajtov, pakiet, chyby pri prenose a dropy.
- Reálno-časové grafy: Grafy pre odoslané bajty, prijaté bajty a využitie šírky pásma, vůdaka ktorým je jednoduchšie pochopiť, ako sieť v reálnom čase funguje a ako sa menia prenosy dát.
- Dôraz na responzivitu a dizajn: Rozhranie aplikácie prispôsobuje veľkosť okna a poskytuje prehľadný výstup, čím zabezpečuje lepšie zobrazenie grafov a informácií na rôznych obrazovkách.
Skúšobný test a zlepšenie aplikácie
Po úprave aplikácie som zaznamenal, že reálno-časové grafy majú tendenciu sa rozhadzovať pri zmene veľkosti okna. Preto som optimalizoval rozmiestnenie grafov a ďalších prvkov tak, aby sa zachovala lepšia stabilita a prehľadnosť.
Momentálne je projekt vo verzii, kde sú grafy umiestnené vertikálne pod sebou, čo lepšie vyhovuje dizajnovým požiadavkám a zlepšuje celkový vizuál aplikácie. Reálno-časový monitoring teraz poskytuje lepší zážitok pre užívateľa.
Budúce plány
V pláne je pridať ďalšie metriky, napríklad sledovanie konkrétneho sieťového rozhrania a prídanie možnosti exportu sieťových štatistík do CSV súboru pre ďalšie analýzy. Plánujem sa rovnako zamerať na vylepšenie optimalizácie kódu, aby aplikácia fungovala čo najefektívnejšie aj pri väčšom využití siete.
Dúfam, že sa vám táto aplikácia bude páčiť a ak budete mať nápady na vylepšenia, neváhajte mi napísať do komentárov! ?
|
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 |
import tkinter as tk from ttkbootstrap import Style import threading import time # Automaticky overenie a inštalácia knižnice psutil a matplotlib import subprocess import sys try: import psutil except ImportError: subprocess.check_call([sys.executable, "-m", "pip", "install", "psutil"]) import psutil try: from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import matplotlib.pyplot as plt except ImportError: subprocess.check_call([sys.executable, "-m", "pip", "install", "matplotlib"]) from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import matplotlib.pyplot as plt class NetworkMonitorApp: def __init__(self, root): self.root = root self.root.title("Monitorovanie siete - Real-Time Network Monitor") self.style = Style(theme='darkly') self.root.geometry("1600x900") # Informacie o sieti self.network_info_frame = tk.Frame(self.root, padx=10, pady=10) self.network_info_frame.pack(fill="both", expand=False, side=tk.TOP) # Rozdelenie na viacero stĺpcov pre lepšiu čitateľnosť for i in range(6): self.network_info_frame.columnconfigure(i, weight=1) # Nastavenie menšieho písma a pridaných rozstupov label_font = ("Helvetica", 10) value_font = ("Helvetica", 10) # Prvý stĺpec self.label_interface = tk.Label(self.network_info_frame, text="Sieťový interface: ", font=label_font) self.label_interface.grid(row=0, column=0, sticky="w", padx=10, pady=5) self.value_interface = tk.Label(self.network_info_frame, text="", font=value_font) self.value_interface.grid(row=0, column=1, sticky="w", padx=10, pady=5) self.label_sent = tk.Label(self.network_info_frame, text="Odoslaných bajtov: ", font=label_font) self.label_sent.grid(row=1, column=0, sticky="w", padx=10, pady=5) self.value_sent = tk.Label(self.network_info_frame, text="", font=value_font) self.value_sent.grid(row=1, column=1, sticky="w", padx=10, pady=5) self.label_received = tk.Label(self.network_info_frame, text="Prijatých bajtov: ", font=label_font) self.label_received.grid(row=2, column=0, sticky="w", padx=10, pady=5) self.value_received = tk.Label(self.network_info_frame, text="", font=value_font) self.value_received.grid(row=2, column=1, sticky="w", padx=10, pady=5) self.label_packets_sent = tk.Label(self.network_info_frame, text="Odoslané pakety: ", font=label_font) self.label_packets_sent.grid(row=3, column=0, sticky="w", padx=10, pady=5) self.value_packets_sent = tk.Label(self.network_info_frame, text="", font=value_font) self.value_packets_sent.grid(row=3, column=1, sticky="w", padx=10, pady=5) # Druhý stĺpec self.label_packets_received = tk.Label(self.network_info_frame, text="Prijaté pakety: ", font=label_font) self.label_packets_received.grid(row=0, column=2, sticky="w", padx=10, pady=5) self.value_packets_received = tk.Label(self.network_info_frame, text="", font=value_font) self.value_packets_received.grid(row=0, column=3, sticky="w", padx=10, pady=5) self.label_errors_in = tk.Label(self.network_info_frame, text="Prijaté chyby: ", font=label_font) self.label_errors_in.grid(row=1, column=2, sticky="w", padx=10, pady=5) self.value_errors_in = tk.Label(self.network_info_frame, text="", font=value_font) self.value_errors_in.grid(row=1, column=3, sticky="w", padx=10, pady=5) self.label_errors_out = tk.Label(self.network_info_frame, text="Odoslané chyby: ", font=label_font) self.label_errors_out.grid(row=2, column=2, sticky="w", padx=10, pady=5) self.value_errors_out = tk.Label(self.network_info_frame, text="", font=value_font) self.value_errors_out.grid(row=2, column=3, sticky="w", padx=10, pady=5) self.label_drop_in = tk.Label(self.network_info_frame, text="Prijaté dropy: ", font=label_font) self.label_drop_in.grid(row=3, column=2, sticky="w", padx=10, pady=5) self.value_drop_in = tk.Label(self.network_info_frame, text="", font=value_font) self.value_drop_in.grid(row=3, column=3, sticky="w", padx=10, pady=5) # Tretí stĺpec self.label_drop_out = tk.Label(self.network_info_frame, text="Odoslané dropy: ", font=label_font) self.label_drop_out.grid(row=0, column=4, sticky="w", padx=10, pady=5) self.value_drop_out = tk.Label(self.network_info_frame, text="", font=value_font) self.value_drop_out.grid(row=0, column=5, sticky="w", padx=10, pady=5) self.label_ip_address = tk.Label(self.network_info_frame, text="IP Adresa: ", font=label_font) self.label_ip_address.grid(row=1, column=4, sticky="w", padx=10, pady=5) self.value_ip_address = tk.Label(self.network_info_frame, text="", font=value_font) self.value_ip_address.grid(row=1, column=5, sticky="w", padx=10, pady=5) self.label_mac_address = tk.Label(self.network_info_frame, text="MAC Adresa: ", font=label_font) self.label_mac_address.grid(row=2, column=4, sticky="w", padx=10, pady=5) self.value_mac_address = tk.Label(self.network_info_frame, text="", font=value_font) self.value_mac_address.grid(row=2, column=5, sticky="w", padx=10, pady=5) self.label_bandwidth_usage = tk.Label(self.network_info_frame, text="Využitie šírky pásma: ", font=label_font) self.label_bandwidth_usage.grid(row=3, column=4, sticky="w", padx=10, pady=5) self.value_bandwidth_usage = tk.Label(self.network_info_frame, text="", font=value_font) self.value_bandwidth_usage.grid(row=3, column=5, sticky="w", padx=10, pady=5) self.label_cpu_usage = tk.Label(self.network_info_frame, text="Využitie CPU sieťových procesov: ", font=label_font) self.label_cpu_usage.grid(row=4, column=4, sticky="w", padx=10, pady=5) self.value_cpu_usage = tk.Label(self.network_info_frame, text="", font=value_font) self.value_cpu_usage.grid(row=4, column=5, sticky="w", padx=10, pady=5) # Real-time grafy pre odoslané a prijaté bajty self.graph_frame = tk.Frame(self.root) self.graph_frame.pack(fill="both", expand=True, side=tk.BOTTOM) # Vytvorenie jednotlivých grafov v oddelených rámcoch pre lepšiu kontrolu rozloženia self.fig, (self.ax_sent, self.ax_recv, self.ax_bandwidth) = plt.subplots(3, 1, figsize=(12, 10), dpi=100) self.fig.tight_layout(pad=4.0) # Nastavenie vylepšeného dizajnu pre každý graf self.ax_sent.grid(True, linestyle='--', alpha=0.6) self.ax_sent.set_title("Odoslané bajty (MB)") self.ax_sent.set_ylabel("MB") self.sent_data = [0] * 50 self.x_data = list(range(50)) self.sent_line, = self.ax_sent.plot(self.x_data, self.sent_data, color='blue', linestyle='-', linewidth=2.0) self.ax_recv.grid(True, linestyle='--', alpha=0.6) self.ax_recv.set_title("Prijaté bajty (MB)") self.ax_recv.set_ylabel("MB") self.recv_data = [0] * 50 self.recv_line, = self.ax_recv.plot(self.x_data, self.recv_data, color='green', linestyle='-', linewidth=2.0) self.ax_bandwidth.grid(True, linestyle='--', alpha=0.6) self.ax_bandwidth.set_title("Využitie šírky pásma (KB/s)") self.ax_bandwidth.set_ylabel("KB/s") self.bandwidth_data = [0] * 50 self.bandwidth_line, = self.ax_bandwidth.plot(self.x_data, self.bandwidth_data, color='red', linestyle='-', linewidth=2.0) self.canvas = FigureCanvasTkAgg(self.fig, master=self.graph_frame) self.canvas.get_tk_widget().pack(fill="both", expand=True) # Spustenie aktualizácie informácií o sieti self.update_thread = threading.Thread(target=self.update_network_info, daemon=True) self.update_thread.start() # Správne ukončenie aplikácie self.root.protocol("WM_DELETE_WINDOW", self.on_closing) def update_network_info(self): while True: try: net_io = psutil.net_io_counters() self.value_interface.config(text="Všetky dostupné") self.value_sent.config(text=f"{net_io.bytes_sent / 1024**2:.2f} MB") self.value_received.config(text=f"{net_io.bytes_recv / 1024**2:.2f} MB") self.value_packets_sent.config(text=f"{net_io.packets_sent}") self.value_packets_received.config(text=f"{net_io.packets_recv}") self.value_errors_in.config(text=f"{net_io.errin}") self.value_errors_out.config(text=f"{net_io.errout}") self.value_drop_in.config(text=f"{net_io.dropin}") self.value_drop_out.config(text=f"{net_io.dropout}") # Získanie ďalších informácií o sieti interfaces = psutil.net_if_addrs() for interface, addrs in interfaces.items(): if interface == 'Wi-Fi' or interface == 'Ethernet' or 'eth' in interface or 'wlan' in interface: for addr in addrs: if addr.family == 2: # IPv4 self.value_ip_address.config(text=addr.address) elif addr.family == 17: # MAC Address self.value_mac_address.config(text=addr.address) # Aktualizácia údajov o šírke pásma a CPU využití current_bandwidth_usage = (net_io.bytes_sent + net_io.bytes_recv) / 1024 self.value_bandwidth_usage.config(text=f"{current_bandwidth_usage:.2f} KB/s") net_procs = [proc for proc in psutil.process_iter(['name', 'cpu_percent']) if 'net' in proc.info['name'].lower()] total_cpu_usage = sum(proc.info['cpu_percent'] for proc in net_procs) self.value_cpu_usage.config(text=f"{total_cpu_usage:.2f} %") # Aktualizácia údajov pre grafy self.sent_data.append(net_io.bytes_sent / 1024**2) self.recv_data.append(net_io.bytes_recv / 1024**2) self.bandwidth_data.append(current_bandwidth_usage) if len(self.sent_data) > 50: self.sent_data.pop(0) if len(self.recv_data) > 50: self.recv_data.pop(0) if len(self.bandwidth_data) > 50: self.bandwidth_data.pop(0) self.sent_line.set_ydata(self.sent_data) self.recv_line.set_ydata(self.recv_data) self.bandwidth_line.set_ydata(self.bandwidth_data) self.ax_sent.relim() self.ax_sent.autoscale_view() self.ax_recv.relim() self.ax_recv.autoscale_view() self.ax_bandwidth.relim() self.ax_bandwidth.autoscale_view() self.canvas.draw() time.sleep(1) except Exception as e: print(f"Error updating network info: {e}") def on_closing(self): self.root.quit() self.root.destroy() if __name__ == "__main__": root = tk.Tk() app = NetworkMonitorApp(root) root.mainloop() |






