From c3a78425290079a20876a47d689803b384dbb56b Mon Sep 17 00:00:00 2001 From: Vincent Hanewinkel Date: Thu, 14 Aug 2025 22:01:36 +0200 Subject: [PATCH] try fix --- Controll.py | 69 ++++++++++++++--------------------------------------- GUI.py | 16 ++++++------- 2 files changed, 26 insertions(+), 59 deletions(-) diff --git a/Controll.py b/Controll.py index 88a818c..dc1b64f 100644 --- a/Controll.py +++ b/Controll.py @@ -4,6 +4,7 @@ from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import pyqtSignal, QObject from GUI import MainWindow from DeviceController import DeviceController +from functools import partial class ControllerSignals(QObject): started = pyqtSignal(str) # serial @@ -32,39 +33,29 @@ def main(): win = MainWindow() # Kleine Helfer, damit die ListItem-Buttons nur Controller.start/stop aufrufen - def make_on_start(ctrl, widget): - def _start(checked=False): - try: - ctrl.start() # startet Worker-Threads, blockiert nicht - widget.set_running(True) - except Exception as e: - print(f"Fehler beim Start {ctrl.dev.serial}: {e}") - return _start + def on_start(ctrl, widget, checked=False): + try: + ctrl.start() # darf nicht blockieren! + widget.set_running(True) + except Exception as e: + print("Start-Fehler:", e) - def make_on_stop(ctrl, widget): - def _stop(checked=False): - try: - ctrl.stop() - widget.set_running(False) - except Exception as e: - print(f"Fehler beim Stop {ctrl.dev.serial}: {e}") - return _stop + def on_stop(ctrl, widget, checked=False): + try: + ctrl.stop() + widget.set_running(False) + except Exception as e: + print("Stop-Fehler:", e) # 3) Liste befüllen (auf der INSTANZ, nicht auf der Klasse!) for i, serial in enumerate(serials): ctrl = controllers[serial] - placeholder = lambda checked=False: None - widget = win.add_list_item( - text=serial, - index=i, - on_start = make_on_start(ctrl, placeholder), # placeholder siehe unten - on_stop = make_on_stop(ctrl, placeholder), - ) + widget = win.add_list_item(serial, i) + # Wichtig: partial gibt eine Callback-Funktion mit fester Signatur zurück; + # PyQt darf noch ein 'checked' anhängen -> unsere Slots akzeptieren es. + widget.btn_start.clicked.connect(partial(on_start, ctrl, widget)) + widget.btn_stop.clicked.connect(partial(on_stop, ctrl, widget)) - 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 win.show() @@ -72,27 +63,3 @@ def main(): if __name__ == "__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() \ No newline at end of file diff --git a/GUI.py b/GUI.py index f7d939e..667a9bb 100644 --- a/GUI.py +++ b/GUI.py @@ -21,20 +21,20 @@ class ListItemWidget(QWidget): self.btn_start = QPushButton("Start") self.btn_stop = QPushButton("Stop") 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_stop) + layout.setContentsMargins(5, 2, 5, 2) def set_running(self, running: bool): - self.btn_start.setEnabled(not running) - self.btn_stop.setEnabled(running) + self.btn_start.setEnabled(not running if isinstance(running, bool) else True) # robust + self.btn_stop.setEnabled(bool(running)) class MainWindow(QWidget): def __init__(self): super().__init__() - self.setWindowTitle("Liste mit 2 Köpfen") - self.resize(360, 280) + self.setWindowTitle("Geräteliste") + self.resize(420, 320) main_layout = QVBoxLayout(self) @@ -45,9 +45,9 @@ class MainWindow(QWidget): # for i in range(5): # 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() - widget = ListItemWidget(text, index, on_start, on_stop) + widget = ListItemWidget(text, index) item.setSizeHint(widget.sizeHint()) self.list_widget.addItem(item) self.list_widget.setItemWidget(item, widget)