Untitled
unknown
plain_text
a year ago
5.5 kB
4
Indexable
class WiFiDiagnosticsScreen(ctk.CTkToplevel):
def __init__(self, parent, dark_mode: bool, language: str):
super().__init__(parent)
self.diagnostics = WiFiDiagnostics()
self.dark_mode = dark_mode
self.language = language
# Make it fullscreen
self.overrideredirect(True)
self.geometry(f"{self.winfo_screenwidth()}x{self.winfo_screenheight()}+0+0")
bg_color = '#1c1c1e' if dark_mode else '#f5f5f7'
accent_color = '#2c2c2e' if dark_mode else '#e5e5e7'
text_color = 'white' if dark_mode else 'black'
self.configure(fg_color=bg_color)
# Header with title and close button
header = ctk.CTkFrame(self, fg_color=bg_color, height=50)
header.pack(fill='x', padx=20, pady=(20,10))
title = ctk.CTkLabel(
header,
text=TRANSLATIONS[language]['wifi_diagnostics'],
font=("Dongle", 24, "bold"),
text_color=text_color
)
title.pack(side='left')
close_btn = ctk.CTkButton(
header,
text="×",
width=40,
height=40,
font=("Dongle", 20),
fg_color=accent_color,
hover_color='#3a3a3c' if dark_mode else '#d1d1d6',
command=self.destroy
)
close_btn.pack(side='right')
# Two column layout
columns = ctk.CTkFrame(self, fg_color=bg_color)
columns.pack(fill='both', expand=True, padx=20, pady=10)
# Left status panel
self.status_panel = ctk.CTkFrame(
columns,
fg_color=accent_color,
corner_radius=10,
width=300
)
self.status_panel.pack(side='left', fill='y', padx=(0,10))
# Status info
self.network_label = ctk.CTkLabel(
self.status_panel,
text="-",
font=("Dongle", 16),
text_color=text_color
)
self.network_label.pack(pady=10)
self.status_value = ctk.CTkLabel(
self.status_panel,
text=TRANSLATIONS[self.language]['wifi_disconnected'],
font=("Dongle", 16),
text_color='#ff453a'
)
self.status_value.pack(pady=10)
# Network list
self.network_list = ctk.CTkScrollableFrame(
columns,
fg_color=accent_color,
corner_radius=10
)
self.network_list.pack(side='left', fill='both', expand=True)
# Start monitoring and scan
self.diagnostics.start_monitoring(self.update_status)
self.scan_networks()
def scan_networks(self):
try:
result = subprocess.run(['sudo', 'iwlist', 'wlan0', 'scan'],
capture_output=True, text=True)
networks = []
seen_ssids = set() # Track seen SSIDs
for line in result.stdout.split('\n'):
if 'ESSID:' in line:
ssid = line.split('ESSID:"')[1].split('"')[0]
if ssid and ssid not in seen_ssids: # Only add if not seen before
networks.append({'ssid': ssid})
seen_ssids.add(ssid)
self._update_network_list(networks)
except Exception as e:
print(f"Scan error: {e}")
# Schedule next scan
self.after(30000, self.scan_networks)
def _update_network_list(self, networks):
# Clear existing list
for widget in self.network_list.winfo_children():
widget.destroy()
current_network = self.diagnostics.get_current_network()
for network in networks:
ssid = network['ssid']
is_current = ssid == current_network
btn = ctk.CTkButton(
self.network_list,
text=ssid + (" (Connected)" if is_current else ""),
font=("Dongle", 16),
height=40,
fg_color='#34c759' if is_current else '#3a3a3c' if self.dark_mode else '#d1d1d6',
hover_color='#32b357' if is_current else '#34c759',
text_color='white' if self.dark_mode else 'black',
command=lambda s=ssid: self.show_connection_screen(s)
)
btn.pack(fill='x', pady=2, padx=5)
def update_status(self, status):
try:
if status['network']:
self.network_label.configure(text=status['network'])
self.status_value.configure(
text=TRANSLATIONS[self.language]['wifi_connected'],
text_color='#34c759'
)
else:
self.network_label.configure(text="-")
self.status_value.configure(
text=TRANSLATIONS[self.language]['wifi_disconnected'],
text_color='#ff453a'
)
except tk.TclError:
pass # Widget was destroyed
def show_connection_screen(self, network_ssid):
ConnectionScreen(self, network_ssid, self.dark_mode, self.language)Editor is loading...
Leave a Comment