From 29c41bdfe835270f49c412b0ef31dd4918daea8e Mon Sep 17 00:00:00 2001 From: Vincent Hanewinkel Date: Thu, 14 Aug 2025 21:42:10 +0200 Subject: [PATCH] trv fix --- Controll.py | 39 +++++++++++++++++++++++++++++++++------ GUI.py | 24 ++++++++++-------------- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/Controll.py b/Controll.py index 28d1073..9a09213 100644 --- a/Controll.py +++ b/Controll.py @@ -1,9 +1,36 @@ import sys import pysmu from PyQt5.QtWidgets import QApplication +from PyQt5.QtCore import pyqtSignal, QObject from GUI import MainWindow from DeviceController import DeviceController +class ControllerSignals(QObject): + started = pyqtSignal(str) # serial + stopped = pyqtSignal(str) + error = pyqtSignal(str, str) # serial, msg + +signals = ControllerSignals() + +def make_on_start(ctrl, widget): + def _start(_widget=widget, _ctrl=ctrl): + # NICHT blockieren: nur anstoßen + try: + _ctrl.start() # -> startet seine eigenen Threads + _widget.set_running(True) + except Exception as e: + signals.error.emit(_ctrl.dev.serial, str(e)) + return _start + +def make_on_stop(ctrl, widget): + def _stop(_widget=widget, _ctrl=ctrl): + try: + _ctrl.stop() + _widget.set_running(False) + except Exception as e: + signals.error.emit(_ctrl.dev.serial, str(e)) + return _stop + def main(): # 1) Geräte einsammeln (pysmu nur hier benutzen) sess = pysmu.Session() @@ -33,13 +60,13 @@ def main(): # 3) Liste befüllen (auf der INSTANZ, nicht auf der Klasse!) for i, serial in enumerate(serials): ctrl = controllers[serial] - win.add_list_item( - serial, - i, - make_on_start(ctrl), - make_on_stop(ctrl), + widget = win.add_list_item( + text=serial, + index=i, + on_start=lambda w, c=ctrl: make_on_start(c, w)(), + on_stop =lambda w, c=ctrl: make_on_stop(c, w)() ) - + # 4) Start win.show() sys.exit(app.exec_()) diff --git a/GUI.py b/GUI.py index 5182518..419ca00 100644 --- a/GUI.py +++ b/GUI.py @@ -18,21 +18,17 @@ class ListItemWidget(QWidget): layout.addStretch() # schiebt die Buttons nach rechts - btn1 = QPushButton("Start") - btn2 = QPushButton("Stop") - - # Variante A: partial – übergibt index (und ignoriert das Qt-"checked") - btn1.clicked.connect(partial(on_start, index)) - btn2.clicked.connect(partial(on_stop, index)) - - # Variante B (gleichwertig): lambda - # btn1.clicked.connect(lambda checked=False, i=index: on_start(i)) - # btn2.clicked.connect(lambda checked=False, i=index: on_stop(i)) - - layout.addWidget(btn1) - layout.addWidget(btn2) - layout.setContentsMargins(5, 2, 5, 2) + 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) + def set_running(self, running: bool): + self.btn_start.setEnabled(not running) + self.btn_stop.setEnabled(running) class MainWindow(QWidget): def __init__(self):