Download gui.py from kalle07/SmartTaskMonitor: direct link, hf CLI and curl.
- Browser
- Download file 10.9 kB
-
https://huggingface.co/kalle07/SmartTaskMonitor/resolve/main/gui.py
- Command line
-
hf download hf://kalle07/SmartTaskMonitor/gui.py
-
curl -L -o gui.py https://huggingface.co/kalle07/SmartTaskMonitor/resolve/main/gui.py
10.9 kB
| # gui.py | |
| import wx | |
| class MainFrame(wx.Frame): | |
| MAX_WIDTH = 1000 | |
| MAX_HEIGHT = 1000 | |
| MIN_WIDTH = 300 | |
| MIN_HEIGHT = 200 | |
| def __init__(self, *args, hardware_info=None, result_queue=None, **kwargs): | |
| super().__init__(*args, **kwargs) | |
| self.hardware_info = hardware_info or {} | |
| self.result_queue = result_queue | |
| self.selected_components = { | |
| 'cpu': True, | |
| 'ram': True, | |
| 'gpu': True, | |
| 'network': True, | |
| 'drives': [] | |
| } | |
| # EVT_CLOSE binden | |
| self.Bind(wx.EVT_CLOSE, self.on_close) | |
| # Checkboxen speichern: Dictionary mit Kategorie als Key und Liste von Checkboxes als Value | |
| self.checkboxes = {} | |
| self.panel = wx.Panel(self) | |
| vbox = wx.BoxSizer(wx.VERTICAL) | |
| info = wx.StaticText(self.panel, label="Window will self-close in 10 sec") | |
| vbox.Add(info, 0, wx.ALL, 10) | |
| auto_close_info = wx.StaticText( | |
| self.panel, | |
| label="Drive monitoring (read/write) every second\nThreshold 2MB" | |
| ) | |
| vbox.Add(auto_close_info, 0, wx.LEFT | wx.BOTTOM, 10) | |
| tray_info = wx.StaticText( | |
| self.panel, | |
| label="(Hover over tray icon to see further information)" | |
| ) | |
| vbox.Add(tray_info, 0, wx.LEFT | wx.BOTTOM, 10) | |
| # CPU-Info: eine Checkbox mit zusammengesetzten Infos | |
| if hardware_info.get('cpu_info'): | |
| cpu_info = hardware_info['cpu_info'] | |
| cpu_label = (f"CPU Info: Logical cores: {cpu_info.get('logical_cores')}, " | |
| f"Physical cores: {cpu_info.get('physical_cores')}, " | |
| f"Frequency: {cpu_info.get('frequency', 'N/A')} MHz") | |
| checkbox = wx.CheckBox(self.panel, label=cpu_label) | |
| checkbox.SetValue(True) | |
| vbox.Add(checkbox, 0, wx.LEFT | wx.BOTTOM, 10) | |
| self.checkboxes['cpu'] = [checkbox] | |
| # RAM-Info: eine Checkbox mit zusammengesetzten Infos | |
| if hardware_info.get('ram_info'): | |
| ram_info = hardware_info['ram_info'] | |
| ram_label = (f"RAM Info: Total: {ram_info.get('total_gb', 'N/A')} GB, " | |
| f"Available: {ram_info.get('available_gb', 'N/A')} GB") | |
| checkbox = wx.CheckBox(self.panel, label=ram_label) | |
| checkbox.SetValue(True) | |
| vbox.Add(checkbox, 0, wx.LEFT | wx.BOTTOM, 10) | |
| self.checkboxes['ram'] = [checkbox] | |
| # GPU-Info | |
| if hardware_info.get('gpu_info'): | |
| self.add_section(vbox, "GPU Info:", [ | |
| f"{gpu['name']} ({gpu['memory_total_mb']} MB VRAM / MaxTemp: {gpu['max_temp']} °C)" | |
| for gpu in hardware_info['gpu_info'] | |
| ], category="gpu") | |
| # Netzwerkadapter | |
| if hardware_info.get('network_adapters'): | |
| self.add_section(vbox, "Active Network Adapters:", hardware_info['network_adapters'], category="network") | |
| # Drive-Info | |
| if hardware_info.get('drive_map'): | |
| self.add_drive_section(vbox) | |
| # Submit Button | |
| self.submit_button = wx.Button(self.panel, label="Submit and Close (10)") | |
| self.submit_button.Bind(wx.EVT_BUTTON, self.on_submit) | |
| vbox.Add(self.submit_button, 0, wx.ALL | wx.CENTER, 10) | |
| self.panel.SetSizer(vbox) | |
| self.panel.Layout() | |
| self.submit_button.SetFocus() | |
| self.SetDefaultItem(self.submit_button) | |
| best_size = self.panel.GetBestSize() | |
| width = min(max(best_size.width, self.MIN_WIDTH), self.MAX_WIDTH) | |
| height = min(max(best_size.height, self.MIN_HEIGHT), self.MAX_HEIGHT) | |
| self.SetClientSize((width, height)) | |
| self.SetPosition((200,100)) | |
| self.SetTitle("SmartTaskTool by Sevenof9") | |
| self.countdown_timer = 10 | |
| self.timer = wx.Timer(self) | |
| self.Bind(wx.EVT_TIMER, self.update_countdown, self.timer) | |
| self.timer.Start(1000) # Update every second | |
| def update_countdown(self, event): | |
| self.countdown_timer -= 1 | |
| if self.countdown_timer <= 0: | |
| self.submit_values() | |
| self.timer.Stop() | |
| else: | |
| self.submit_button.SetLabel(f"Submit and Close ({self.countdown_timer})") | |
| def add_drive_section(self, vbox): | |
| drive_map = self.hardware_info.get('drive_map', {}) | |
| vbox.Add(wx.StaticText(self.panel, label="Detected Drives:"), 0, wx.LEFT | wx.TOP, 10) | |
| for dev in sorted(drive_map.keys()): | |
| parts = drive_map[dev] | |
| for part_info in sorted(parts, key=lambda x: x['letter']): | |
| letter = part_info.get('letter', 'N/A') | |
| label = part_info.get('label', 'N/A') | |
| checkbox_label = f"{dev} - {letter} ({label})" | |
| checkbox = wx.CheckBox(self.panel, label=checkbox_label) | |
| checkbox.SetValue(True) | |
| vbox.Add(checkbox, 0, wx.LEFT | wx.BOTTOM, 10) | |
| if 'drives' not in self.checkboxes: | |
| self.checkboxes['drives'] = [] | |
| self.checkboxes['drives'].append((dev, letter, checkbox)) | |
| def submit_values(self): | |
| selected_components = { | |
| 'cpu': False, | |
| 'ram': False, | |
| 'gpu': False, | |
| 'network': False, | |
| 'drives': [] | |
| } | |
| checkbox_categories = ['cpu', 'ram', 'gpu', 'network'] | |
| for category in checkbox_categories: | |
| if category in self.checkboxes: | |
| selected_components[category] = any(checkbox.GetValue() for checkbox in self.checkboxes[category]) | |
| if 'drives' in self.checkboxes: | |
| for dev, part, checkbox in self.checkboxes['drives']: | |
| if checkbox.GetValue(): | |
| selected_components['drives'].append((dev, part)) | |
| # Hardwareinfo ergänzen | |
| selected_components['cpu_info'] = self.hardware_info.get('cpu_info', {}) | |
| selected_components['ram_info'] = self.hardware_info.get('ram_info', {}) | |
| selected_components['gpu_info'] = self.hardware_info.get('gpu_info', []) | |
| selected_components['network_adapters'] = self.hardware_info.get('network_adapters', []) | |
| selected_components['drive_map'] = self.hardware_info.get('drive_map', {}) | |
| print("[DEBUG] Auswahl:", selected_components) | |
| if self.result_queue: | |
| self.result_queue.put(selected_components) | |
| self.Close() | |
| def on_submit(self, event): | |
| print("[DEBUG] Submit-Button geklickt") | |
| self.submit_values() | |
| def add_section(self, vbox, title, items, category): | |
| vbox.Add(wx.StaticText(self.panel, label=title), 0, wx.LEFT | wx.TOP, 10) | |
| for item in items: | |
| checkbox = wx.CheckBox(self.panel, label=item) | |
| checkbox.SetValue(True) | |
| vbox.Add(checkbox, 0, wx.LEFT | wx.BOTTOM, 10) | |
| if category not in self.checkboxes: | |
| self.checkboxes[category] = [] | |
| if category == "drives": | |
| # Assuming dev and part are extracted from item | |
| parts = item.split(":") | |
| if len(parts) == 2: | |
| dev, part = parts | |
| self.checkboxes[category].append((dev.strip(), part.strip(), checkbox)) | |
| else: | |
| self.checkboxes[category].append(checkbox) | |
| def get_selected_components(self): | |
| selected = { | |
| 'cpu': False, | |
| 'ram': False, | |
| 'gpu': False, | |
| 'network': False, | |
| 'drives': [] | |
| } | |
| for category, checkboxes in self.checkboxes.items(): | |
| if category == 'drives': | |
| # drives ist eine Liste von Tupeln: (dev, part, checkbox) | |
| drive_map = self.hardware_info.get('drive_map', {}) | |
| selected_drives = [] | |
| for entry in self.checkboxes: | |
| if len(entry) == 3: | |
| category, checkbox, item = entry | |
| if category == "drives" and checkbox.GetValue(): | |
| if ":" in item: | |
| dev, part = item.split(":", 1) | |
| selected_drives.append((dev.strip(), part.strip())) | |
| selected['drives'] = selected_drives | |
| else: | |
| # normale checkbox listen | |
| if any(checkbox.GetValue() for checkbox in checkboxes): | |
| selected[category] = True | |
| # Hardwareinfos ergänzen | |
| selected['cpu_info'] = self.hardware_info.get('cpu_info', {}) | |
| selected['ram_info'] = self.hardware_info.get('ram_info', {}) | |
| selected['gpu_info'] = self.hardware_info.get('gpu_info', []) | |
| selected['network_adapters'] = self.hardware_info.get('network_adapters', []) | |
| selected_components['drive_map'] = self.hardware_info.get('drive_map', {}) | |
| return selected | |
| def on_close(self, event): | |
| print("[DEBUG] Fenster wird geschlossen") | |
| if hasattr(self, 'timer') and self.timer.IsRunning(): | |
| self.timer.Stop() | |
| if self.result_queue: | |
| # Leere Auswahl übermitteln | |
| selected_components = { | |
| 'cpu': False, | |
| 'ram': False, | |
| 'gpu': False, | |
| 'network': False, | |
| 'drives': [], | |
| 'cpu_info': self.hardware_info.get('cpu_info', {}), | |
| 'ram_info': self.hardware_info.get('ram_info', {}), | |
| 'gpu_info': self.hardware_info.get('gpu_info', []), | |
| 'network_adapters': self.hardware_info.get('network_adapters', []), | |
| 'drive_map': self.hardware_info.get('drive_map', {}) | |
| } | |
| self.result_queue.put(selected_components) | |
| self.Destroy() | |
| app = wx.GetApp() | |
| if app: | |
| app.ExitMainLoop() | |
| if __name__ == "__main__": | |
| app = wx.App(False) | |
| # Layout | |
| hardware_info = { | |
| 'cpu_info': { | |
| 'logical_cores': 8, | |
| 'physical_cores': 4, | |
| 'frequency': 3200, | |
| }, | |
| 'ram_info': { | |
| 'total_gb': 16, | |
| 'available_gb': 10 | |
| }, | |
| 'gpu_info': [ | |
| {'name': 'NVIDIA GTX 1080', 'memory_total_mb': 8192, 'max_temp': 84} | |
| ], | |
| 'network_adapters': ['Ethernet', 'Wi-Fi'], | |
| 'drive_map': { | |
| 'Disk0': [{'letter': 'C:', 'label': 'System'}, {'letter': 'D:', 'label': 'Recovery'}], | |
| 'Disk1': [{'letter': 'E:', 'label': 'Data'}] | |
| } | |
| } | |
| frame = MainFrame(None, hardware_info=hardware_info) | |
| frame.Show() | |
| app.MainLoop() | |