Button drücken und Variable mit übergeben

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Kriccemis
User
Beiträge: 15
Registriert: Freitag 8. Mai 2020, 20:10

Hallo Zusammen,

ich habe eine Frage bezüglich dem Einsatz von Buttons. Aktuell erstelle ich Skript zur Ansteuerung einer Pumpe mit 4 Kanälen, jeder Kanal soll über eine Button an und aus geschaltet werden.
Der Einfachheit halber habe ich jedem Button eine eigene DEF zugewiesen. Sozusagen 4 mal die Gleiche...wo sich lediglich ein Zahlenwert zwischen 1-4 unterscheidet.

Ich würde gern das alle Buttons mit der gleichen DEF verbunden sind und entsprechend zusetzlich einen INT Wert von 1-4 übertragen, ist das Möglich?
Daher meine Überlegung, wo jetzt bei dem entsprechenden CH* eine Zahl steht, dann einfach die Variable übertragen, die repräsentativ für 1-4 steht.
Das würde mir im gesamten Code sehr viele Zeilen sparen, da ich sonst immer alles 4-fach machen muss.

Danke für eure Hilfe!!!

Aktuell wird es so gelöst:

Code: Alles auswählen

        # Buttons Pumpenkanäle ein / aus
        self.ui.button_ch1.clicked.connect(self.CH1_on_off)
        self.ui.button_ch2.clicked.connect(self.CH2_on_off)
        self.ui.button_ch3.clicked.connect(self.CH3_on_off)
        self.ui.button_ch4.clicked.connect(self.CH4_on_off)
        
     def CH1_on_off(self):       
        if self.status_ch1 == False:
            self.ser.write("1H\r\n".encode())
            antwort_ch1 = self.ser.read().decode()
            self.label_ch1.setText("running") 
            print("CH1 Abfrage Zustand: "+ antwort_ch1)
            self.status_ch1 = True
        elif self.status_ch1 == True:
            self.ser.write("1I\r\n".encode())
            antwort_ch1 = self.ser.read().decode()
            self.label_ch1.setText("stop")
            print("CH1 Abfrage Zustand: "+ antwort_ch1)
            self.status_ch1 = False
            
    def CH2_on_off(self):
        if self.status_ch2 == False:
            self.ser.write("2H\r\n".encode())
            self.label_ch2.setText("running") 
            antwort_ch2 = self.ser.read().decode()
            print("CH2 Abfrage Zustand: "+ antwort_ch2)
            self.status_ch2 = True
        elif self.status_ch2 == True:
            self.ser.write("2I\r\n".encode())
            self.label_ch2.setText("stop")
            antwort_ch2 = self.ser.read().decode()
            print("CH2 Abfrage Zustand: "+ antwort_ch2)
            self.status_ch2 = False
            
    def CH3_on_off(self):
        if self.status_ch3 == False:
            self.ser.write("3H\r\n".encode())
            self.label_ch3.setText("running") 
            antwort_ch3 = self.ser.read().decode()
            print("CH3 Abfrage Zustand: "+ antwort_ch3)
            self.status_ch3 = True
        elif self.status_ch3 == True:
            self.ser.write("3I\r\n".encode())
            self.label_ch3.setText("stop")
            antwort_ch3 = self.ser.read().decode()
            print("CH3 Abfrage Zustand: "+ antwort_ch3)
            self.status_ch3 = False
            
    def CH4_on_off(self):
        if self.status_ch4 == False:
            self.ser.write("4H\r\n".encode())
            self.label_ch4.setText("running") 
            antwort_ch4 = self.ser.read().decode()
            print("CH4 Abfrage Zustand: "+ antwort_ch4)
            self.status_ch4 = True
        elif self.status_ch4 == True:
            self.ser.write("4I\r\n".encode())
            self.label_ch4.setText("stop")
            antwort_ch4 = self.ser.read().decode()
            print("CH4 Abfrage Zustand: "+ antwort_ch4)
            self.status_ch4 = False
        
Benutzeravatar
__blackjack__
User
Beiträge: 13113
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kriccemis: Du suchst `functools.partial()`.

Edit: Oder wohl doch eher objektorientierte Programmierung, denn die unterscheiden sich ja nicht nur durch eine Zahl als Wert sondern diese Zahl kommt in Attributnamen vor: Man nummeriert keine Namen! Die Attribute sollten zu einem Objekt zusammengefasst werden und die dann in einer Datenstruktur gespeichert werden (sollte man die Objekte selbst dann tatsächlich nicht irgendwo benutzen).
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
bob
User
Beiträge: 8
Registriert: Samstag 3. August 2013, 11:13

Wie wäre es denn mit einer QButtonGroup() ?

Code: Alles auswählen

class Indicator(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        
        self.initialize_ui()
    
    def initialize_ui(self):
        self.create_components()
        self.create_layout()
        
    def sizeHint(self):
        return QtCore.QSize(200, 200)
    
    def create_components(self):
        self.button_ch1 = QtWidgets.QPushButton("Pumpe 1")
        self.button_ch2 = QtWidgets.QPushButton("Pumpe 2")
        self.button_ch3 = QtWidgets.QPushButton("Pumpe 3")
        
        button_group_pumps = QtWidgets.QButtonGroup(self)
        button_group_pumps.addButton(self.button_ch1, id=1)
        button_group_pumps.addButton(self.button_ch2, id=2)
        button_group_pumps.addButton(self.button_ch3, id=3)
        
        button_group_pumps.buttonClicked[int].connect(self.on_button_clicked)# Kann man auch mit einem pyqtSignal verbinden...
        
        self.label_info = QtWidgets.QLabel("Test")
    
    def create_layout(self):
        # Button layout
        layout_btn = QtWidgets.QVBoxLayout()
        layout_btn.addWidget(self.button_ch1)
        layout_btn.addWidget(self.button_ch2)
        layout_btn.addWidget(self.button_ch3)
        
        # Central layout
        layout_central = QtWidgets.QHBoxLayout()
        layout_central.addLayout(layout_btn)
        layout_central.addWidget(self.label_info)
        self.setLayout(layout_central)
    
    @QtCore.pyqtSlot(int)
    def on_button_clicked(self, button):
        self.label_info.setText(f"Pumpe {button}")
        """
        if button == 1:
            pass
        elif button == 2:
            pass
        elif button == 3:
            pass
        [...]
        """
    
    
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Indicator()
    window.move(300, 300)
    window.show()
    sys.exit(app.exec_())
Alternativ könnte man auch mit setProperty() jedem Button eine Variable vergeben und der dann einen IntEnum zuweisen. Dann statt [int] [QAbstractButton] senden und in der Funktion von der Variablen mit property("...") die entsprechende Variable abfragen. Ist vielleicht etwas mehr Tipparbeit, dafür eindeutiger. Ob es lohnt...

Gruß Bob
Kriccemis
User
Beiträge: 15
Registriert: Freitag 8. Mai 2020, 20:10

Danke für eure Unterstützung, mit der Gruppierung klappt es so wie ich es mir erhofft hatte schon recht gut!

VG
Antworten