Untitled

 avatar
unknown
plain_text
7 months ago
5.5 kB
3
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