commit e674f98a714859263a1ace2e512771a478be1164
parent 9f596166e49b0847a7a4b42c3a3bec385d42f3ab
Author: William Lindholm <william_lindholm@outlook.com>
Date: Fri, 29 Dec 2023 21:28:34 +0100
Implemented tkinter GUI.
Diffstat:
| M | main.py | | | 100 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------- |
1 file changed, 75 insertions(+), 25 deletions(-)
diff --git a/main.py b/main.py
@@ -1,29 +1,79 @@
import win32com.client
+import pythoncom
+import threading
+import tkinter as tk
+from tkinter import scrolledtext
import time
-def get_pnp_devices():
- wmi = win32com.client.GetObject("winmgmts:")
- pnp_devices = wmi.InstancesOf("Win32_PnPEntity")
- return {device.DeviceID: device.Name for device in pnp_devices}
+
+class USBDeviceDetector(threading.Thread):
+ def __init__(self, update_callback):
+ super().__init__()
+ self.update_callback = update_callback
+ self.devices_before = self.get_pnp_devices()
+ self.running = True
+
+ def get_pnp_devices(self):
+ pythoncom.CoInitialize() # Initialize COM in the thread
+ wmi = win32com.client.GetObject("winmgmts:")
+ pnp_devices = wmi.InstancesOf("Win32_PnPEntity")
+ devices = {device.DeviceID: device.Name for device in pnp_devices}
+ pythoncom.CoUninitialize() # Uninitialize COM
+ return devices
+
+ def run(self):
+ while self.running:
+ time.sleep(1)
+ devices_now = self.get_pnp_devices()
+ new_devices = devices_now.keys() - self.devices_before.keys()
+ removed_devices = self.devices_before.keys() - devices_now.keys()
+
+ # Update the GUI if there are changes
+ if new_devices or removed_devices:
+ self.update_callback(new_devices, removed_devices)
+
+ self.devices_before = devices_now
+
+ def stop(self):
+ self.running = False
+
+
+class USBDeviceLoggerGUI:
+ def __init__(self, root):
+ self.root = root
+ root.title("USB Device Logger")
+
+ # Create a ScrolledText widget for logging device changes
+ self.log = scrolledtext.ScrolledText(root, state='disabled', width=70, height=20)
+ self.log.grid(row=0, column=0, padx=10, pady=10)
+
+ # Start the USB device detection in a separate thread
+ self.detector = USBDeviceDetector(self.log_device_changes)
+ self.detector.start()
+
+ def log_device_changes(self, new_devices, removed_devices):
+ message = ""
+ for device_id in new_devices:
+ message += f"Connected: {device_id}\n"
+ for device_id in removed_devices:
+ message += f"Disconnected: {device_id}\n"
+
+ # Update the log widget with the detected changes
+ if message:
+ self.log.configure(state='normal')
+ self.log.insert(tk.END, message)
+ self.log.configure(state='disabled')
+ self.log.yview(tk.END)
+
+ def on_close(self):
+ # Ensure thread is properly stopped before closing the GUI
+ self.detector.stop()
+ self.detector.join()
+ self.root.destroy()
+
if __name__ == '__main__':
- devices_before = get_pnp_devices()
- print("Waiting for PnP device change...")
- while True:
- time.sleep(1) # Adding a delay to reduce CPU usage
- devices_now = get_pnp_devices()
-
- new_devices = devices_now.keys() - devices_before.keys()
- removed_devices = devices_before.keys() - devices_now.keys()
-
- if new_devices:
- print("New PnP devices detected:")
- for device_id in new_devices:
- print(devices_now[device_id])
-
- if removed_devices:
- print("PnP devices removed:")
- for device_id in removed_devices:
- print(devices_before[device_id])
-
- devices_before = devices_now
-\ No newline at end of file
+ root = tk.Tk()
+ gui = USBDeviceLoggerGUI(root)
+ root.protocol("WM_DELETE_WINDOW", gui.on_close)
+ root.mainloop()
+\ No newline at end of file