This commit is contained in:
Vincent Hanewinkel 2025-08-14 22:01:36 +02:00
parent a7d2fb0824
commit c3a7842529
2 changed files with 26 additions and 59 deletions

View File

@ -4,6 +4,7 @@ from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import pyqtSignal, QObject from PyQt5.QtCore import pyqtSignal, QObject
from GUI import MainWindow from GUI import MainWindow
from DeviceController import DeviceController from DeviceController import DeviceController
from functools import partial
class ControllerSignals(QObject): class ControllerSignals(QObject):
started = pyqtSignal(str) # serial started = pyqtSignal(str) # serial
@ -32,39 +33,29 @@ def main():
win = MainWindow() win = MainWindow()
# Kleine Helfer, damit die ListItem-Buttons nur Controller.start/stop aufrufen # Kleine Helfer, damit die ListItem-Buttons nur Controller.start/stop aufrufen
def make_on_start(ctrl, widget): def on_start(ctrl, widget, checked=False):
def _start(checked=False):
try: try:
ctrl.start() # startet Worker-Threads, blockiert nicht ctrl.start() # darf nicht blockieren!
widget.set_running(True) widget.set_running(True)
except Exception as e: except Exception as e:
print(f"Fehler beim Start {ctrl.dev.serial}: {e}") print("Start-Fehler:", e)
return _start
def make_on_stop(ctrl, widget): def on_stop(ctrl, widget, checked=False):
def _stop(checked=False):
try: try:
ctrl.stop() ctrl.stop()
widget.set_running(False) widget.set_running(False)
except Exception as e: except Exception as e:
print(f"Fehler beim Stop {ctrl.dev.serial}: {e}") print("Stop-Fehler:", e)
return _stop
# 3) Liste befüllen (auf der INSTANZ, nicht auf der Klasse!) # 3) Liste befüllen (auf der INSTANZ, nicht auf der Klasse!)
for i, serial in enumerate(serials): for i, serial in enumerate(serials):
ctrl = controllers[serial] ctrl = controllers[serial]
placeholder = lambda checked=False: None widget = win.add_list_item(serial, i)
widget = win.add_list_item( # Wichtig: partial gibt eine Callback-Funktion mit fester Signatur zurück;
text=serial, # PyQt darf noch ein 'checked' anhängen -> unsere Slots akzeptieren es.
index=i, widget.btn_start.clicked.connect(partial(on_start, ctrl, widget))
on_start = make_on_start(ctrl, placeholder), # placeholder siehe unten widget.btn_stop.clicked.connect(partial(on_stop, ctrl, widget))
on_stop = make_on_stop(ctrl, placeholder),
)
widget.btn_start.clicked.disconnect()
widget.btn_stop.clicked.disconnect()
widget.btn_start.clicked.connect(make_on_start(ctrl, widget))
widget.btn_stop.clicked.connect(make_on_stop(ctrl, widget))
# 4) Start # 4) Start
win.show() win.show()
@ -72,27 +63,3 @@ def main():
if __name__ == "__main__": if __name__ == "__main__":
main() main()
# # Beispiel: Gerät 1 starten, Gerät 2 später starten/stoppen
# c1 = controllers[serials[0]]
# c1.set_mode(0, MODE.HI_Z) # CH A Hi-Z
# c1.set_mode(1, MODE.HI_Z) # CH B Hi-Z
# c1.start()
# time.sleep(2.0)
# if len(serials) > 1:
# c2 = controllers[serials[1]]
# c2.set_mode(0, MODE.HI_Z)
# c2.set_mode(1, MODE.HI_Z)
# c2.start()
# time.sleep(3.0)
# c2.stop() # nur Gerät 2 stoppen
# # sauber beenden (Strg+C-Handling etc. weglassen der Kürze halber)
# for c in controllers.values():
# c.stop()
# for c in controllers.values():
# c.shutdown()

16
GUI.py
View File

@ -21,20 +21,20 @@ class ListItemWidget(QWidget):
self.btn_start = QPushButton("Start") self.btn_start = QPushButton("Start")
self.btn_stop = QPushButton("Stop") self.btn_stop = QPushButton("Stop")
self.btn_stop.setEnabled(False) self.btn_stop.setEnabled(False)
self.btn_start.clicked.connect(lambda checked=False: on_start(self))
self.btn_stop.clicked.connect(lambda checked=False: on_stop(self))
layout.addWidget(self.btn_start) layout.addWidget(self.btn_start)
layout.addWidget(self.btn_stop) layout.addWidget(self.btn_stop)
layout.setContentsMargins(5, 2, 5, 2)
def set_running(self, running: bool): def set_running(self, running: bool):
self.btn_start.setEnabled(not running) self.btn_start.setEnabled(not running if isinstance(running, bool) else True) # robust
self.btn_stop.setEnabled(running) self.btn_stop.setEnabled(bool(running))
class MainWindow(QWidget): class MainWindow(QWidget):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.setWindowTitle("Liste mit 2 Köpfen") self.setWindowTitle("Geräteliste")
self.resize(360, 280) self.resize(420, 320)
main_layout = QVBoxLayout(self) main_layout = QVBoxLayout(self)
@ -45,9 +45,9 @@ class MainWindow(QWidget):
# for i in range(5): # for i in range(5):
# self.add_list_item(f"Eintrag {i+1}", i+1, self.handle_start, self.handle_stop) # self.add_list_item(f"Eintrag {i+1}", i+1, self.handle_start, self.handle_stop)
def add_list_item(self, text, index, on_start, on_stop): def add_list_item(self, text, index):
item = QListWidgetItem() item = QListWidgetItem()
widget = ListItemWidget(text, index, on_start, on_stop) widget = ListItemWidget(text, index)
item.setSizeHint(widget.sizeHint()) item.setSizeHint(widget.sizeHint())
self.list_widget.addItem(item) self.list_widget.addItem(item)
self.list_widget.setItemWidget(item, widget) self.list_widget.setItemWidget(item, widget)