2016-04-23 11 views
0

Ich habe dieses einfache Fenster (design.py) von Qt Designer abgeleitet, die aus drei Optionsfeldern besteht:pyqt: radioButton.isChecked() wird zweimal ausgeführt

# -*- coding: utf-8 -*- 

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.setEnabled(True) 
     MainWindow.resize(158, 110) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.myradioButton1 = QtGui.QRadioButton(self.centralwidget) 
     self.myradioButton1.setGeometry(QtCore.QRect(20, 10, 102, 22)) 
     self.myradioButton1.setObjectName(_fromUtf8("myradioButton1")) 
     self.myradioButton2 = QtGui.QRadioButton(self.centralwidget) 
     self.myradioButton2.setGeometry(QtCore.QRect(20, 40, 102, 22)) 
     self.myradioButton2.setObjectName(_fromUtf8("myradioButton2")) 
     self.myradioButton3 = QtGui.QRadioButton(self.centralwidget) 
     self.myradioButton3.setGeometry(QtCore.QRect(20, 70, 102, 22)) 
     self.myradioButton3.setObjectName(_fromUtf8("myradioButton3")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.myradioButton1.setText(_translate("MainWindow", "RadioButton1", None)) 
     self.myradioButton2.setText(_translate("MainWindow", "RadioButton2", None)) 
     self.myradioButton3.setText(_translate("MainWindow", "RadioButton3", None)) 

und ich habe diesen Code hinzugefügt , um zu überwachen, welcher Radiobutton aktiviert ist.

# -*- coding: utf-8 -*- 

from PyQt4 import QtGui, QtCore 
import sys 
import design 

class ExampleApp(QtGui.QMainWindow, design.Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(ExampleApp, self).__init__(parent) 
     self.setupUi(self) 

     self.myradioButton1.toggled.connect(self.myradioButton1_function) 
     self.myradioButton2.toggled.connect(self.myradioButton1_function) 
     self.myradioButton3.toggled.connect(self.myradioButton1_function) 

    def myradioButton1_function(self): 
     if self.myradioButton1.isChecked(): 
      print 'myradioButton1 is Checked'   
     if self.myradioButton2.isChecked(): 
      print 'myradioButton2 is Checked'   
     if self.myradioButton3.isChecked(): 
      print 'myradioButton3 is Checked'   

def main(): 
    app = QtGui.QApplication(sys.argv) 
    form = ExampleApp() 
    form.show() 
    app.exec_()   

if __name__ == '__main__': 
    main()  

Ich habe bemerkt, dass, wenn radioButton1 aktiviert ist, es scheint gut zu funktionieren, aber wenn radiobutton2 oder radiobutton3 geprüft werden, wird die Überprüfungsmeldung zweimal gedruckt.

Auf der anderen Seite, wenn ich jedes Signal auf eine andere Funktion, wie diese verbinden:

class ExampleApp(QtGui.QMainWindow, design.Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(ExampleApp, self).__init__(parent) 
     self.setupUi(self) 

     self.myradioButton1.toggled.connect(self.myradioButton1_function) 
     self.myradioButton2.toggled.connect(self.myradioButton2_function) 
     self.myradioButton3.toggled.connect(self.myradioButton3_function) 

    def myradioButton1_function(self): 
     if self.myradioButton1.isChecked(): 
      print 'myradioButton1 is Checked' 

    def myradioButton2_function(self): 
     if self.myradioButton2.isChecked(): 
      print 'myradioButton2 is Checked' 

    def myradioButton3_function(self): 
     if self.myradioButton3.isChecked(): 
      print 'myradioButton3 is Checked' 

dann funktioniert es wie erwartet.

Also, ich denke, dass das Problem auftritt, wenn ich viele Signale an eine Funktion anschließen möchte. Kann jemand dieses Verhalten erklären?

Alle Gedanken würden geschätzt werden.

Antwort

4

Das Signal toggle() wird jedes Mal ausgegeben any Radio Button-Status ändert sich. Als Ergebnis wird das Signal toggle() ausgegeben, wenn Sie auf ein Optionsfeld klicken und der Status dieses Optionsfelds von nicht markiert zu aktiviert wechselt. Wenn Sie auf das Optionsfeld klicken, wird automatisch das Signal toggle() erneut ausgegeben Der Status des Optionsfelds wechselt von aktiviert zu deaktiviert.

Sie können, dass indem Sie die folgende Zeile am Ende des Schlitzes in Aktion sehen:

print self.sender().text() + ' was toggled' 

Verwenden Sie das clicked() Signal statt - eine Taste Radio, dessen Zustand automatisch geprüft unkontrolliert geändert wurde, war nie geklickt.

+0

Es funktioniert gut. Vielen Dank. – user3060854

Verwandte Themen