connect pushbutton mit methode

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Idefix_1024
User
Beiträge: 19
Registriert: Montag 11. Januar 2010, 14:36

Hallo,

ich würde gerne durch das Drücken verschiedener pushButtons eine methode mit verschiedenen Parametern aufrufen. Im Beispiel habe ich eine Funktion für Knopf 1 und eine für Knopf 2 aber ich würde gerne alle Knöpfe mit der Funktion funct_buttonAllg verknüpfen und nur den Parameter abhängig vom Knopf angepasst übergeben. Leider kann man das wohl nicht durch

Code: Alles auswählen

self.connect(self.ui.PB_button3, QtCore.SIGNAL("clicked()"),
                     self.funct_buttonAllg(3))  
also was tun?

Code: Alles auswählen

#!/usr/bin/python
# -*- encoding: utf8 -*-

from PyQt4 import QtCore, QtGui, uic

class WritableObject:
    def __init__(self):
        self.content = []
        
    def write(self, string):
        self.content.append(string)

class GUI(QtGui.QDialog):
    def __init__(self):
                        
        QtGui.QDialog.__init__(self)

        self.ui = uic.loadUi('uiGUI.ui')
        self.ui.show()

        # redirect print to console to widget
        self.consoleBuffer = WritableObject()
        sys.stdout = self.consoleBuffer 
        
        self.connect(self.ui.PB_button1, QtCore.SIGNAL("clicked()"),
                     self.funct_button1)
        self.connect(self.ui.PB_button2, QtCore.SIGNAL("clicked()"),
                     self.funct_button2)
        self.connect(self.ui.PB_button3, QtCore.SIGNAL("clicked()"),
                     self.funct_buttonAllg)        
    
    # functions for the buttons
    def funct_button1(self):
        print "Button 1 pressed"
        self.printToConsole()
    
    def funct_button2(self):
        print "Button 2 pressed"
        self.printToConsole()
    
    def funct_buttonAllg(self, value=1):
        print "Button " + str(value) + " pressed"
        self.printToConsole()
        
    def printToConsole(self):
        self.ui.TE_console.clear()
        self.ui.TE_console.insertPlainText(''.join(self.consoleBuffer.content))
        self.ui.TE_console.ensureCursorVisible()

# ----------------------------------------------------------------------------
if __name__ == "__main__":
    import sys
    from PyQt4 import QtCore, QtGui, uic
    
    app = QtGui.QApplication(sys.argv)
    objGUI = GUI()
    sys.exit(app.exec_())
    
# ----------------------------------------------------------------------------
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

functools.partial
Das Leben ist wie ein Tennisball.
Idefix_1024
User
Beiträge: 19
Registriert: Montag 11. Januar 2010, 14:36

vielen Dank!

das ging erstaunlich einfach... und ich habe wirklich mehr als 30 Min bei google gesucht *kopfschüttl*

Code: Alles auswählen

self.connect(self.ui.PB_button3, QtCore.SIGNAL("clicked()"),
                     functools.partial(self.funct_buttonAllg,3)) 
löst das Problem!
BlackJack

@Idefix_1024: Jetzt könntest Du noch die modernere Art der Verknüpfung zwischen Signal und Slot verwenden:

Code: Alles auswählen

self.ui.PB_button3.clicked.connect(partial(self.funct_buttonAllg, 3))
Antworten