SmartTaskTool / gui.py
kalle07's picture
Upload 5 files
d5174e7 verified
# 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()