This commit is contained in:
Vincent Hanewinkel 2025-08-14 21:42:10 +02:00
parent eb31d60757
commit 29c41bdfe8
2 changed files with 43 additions and 20 deletions

View File

@ -1,9 +1,36 @@
import sys import sys
import pysmu import pysmu
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import pyqtSignal, QObject
from GUI import MainWindow from GUI import MainWindow
from DeviceController import DeviceController 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(): def main():
# 1) Geräte einsammeln (pysmu nur hier benutzen) # 1) Geräte einsammeln (pysmu nur hier benutzen)
sess = pysmu.Session() sess = pysmu.Session()
@ -33,11 +60,11 @@ def main():
# 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]
win.add_list_item( widget = win.add_list_item(
serial, text=serial,
i, index=i,
make_on_start(ctrl), on_start=lambda w, c=ctrl: make_on_start(c, w)(),
make_on_stop(ctrl), on_stop =lambda w, c=ctrl: make_on_stop(c, w)()
) )
# 4) Start # 4) Start

24
GUI.py
View File

@ -18,21 +18,17 @@ class ListItemWidget(QWidget):
layout.addStretch() # schiebt die Buttons nach rechts layout.addStretch() # schiebt die Buttons nach rechts
btn1 = QPushButton("Start") self.btn_start = QPushButton("Start")
btn2 = QPushButton("Stop") self.btn_stop = QPushButton("Stop")
self.btn_stop.setEnabled(False)
# Variante A: partial übergibt index (und ignoriert das Qt-"checked") self.btn_start.clicked.connect(lambda checked=False: on_start(self))
btn1.clicked.connect(partial(on_start, index)) self.btn_stop.clicked.connect(lambda checked=False: on_stop(self))
btn2.clicked.connect(partial(on_stop, index)) layout.addWidget(self.btn_start)
layout.addWidget(self.btn_stop)
# 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)
def set_running(self, running: bool):
self.btn_start.setEnabled(not running)
self.btn_stop.setEnabled(running)
class MainWindow(QWidget): class MainWindow(QWidget):
def __init__(self): def __init__(self):