обработчик нажатия кнопки pyqt4

1

У меня проблема usin pyqt4: вот код, который я использую, дело в том, что если в обработчике события нажата кнопка pushOk, я вызываю chiedi_numeri(), она не показывает мне никакой формы, а если я вызываю chiedi_numeri(), она говорит, что аргумент 3 og QObjectConnect имеет недопустимый тип. как я могу это решить? спасибо

class Ui_dialog(object):
    def setupUi(self, dialog):
        dialog.setObjectName("dialog")
        dialog.resize(400, 300)
        self.pushOk = QtGui.QPushButton(dialog)
        self.pushOk.setGeometry(QtCore.QRect(200, 150, 75, 23))
        self.pushOk.setObjectName("pushOk")
        self.radioButton = QtGui.QRadioButton(dialog)
        self.radioButton.setEnabled(True)
        self.radioButton.setGeometry(QtCore.QRect(60, 40, 261, 18))
        self.radioButton.setChecked(True)
        self.radioButton.setObjectName("radioButton")
        self.radioButton_2 = QtGui.QRadioButton(dialog)
        self.radioButton_2.setGeometry(QtCore.QRect(60, 70, 281, 18))
        self.radioButton_2.setObjectName("radioButton_2")
        self.radioButton_3 = QtGui.QRadioButton(dialog)
        self.radioButton_3.setGeometry(QtCore.QRect(60, 100, 281, 18))
        self.radioButton_3.setObjectName("radioButton_3")
        self.labelRisultato = QtGui.QLabel(dialog)
        self.labelRisultato.setGeometry(QtCore.QRect(70, 200, 261, 51))
        self.labelRisultato.setObjectName("labelRisultato")

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


    def retranslateUi(self, dialog):
        dialog.setWindowTitle(QtGui.QApplication.translate("dialog", "Fibonacci", None, QtGui.QApplication.UnicodeUTF8))
        self.pushOk.setText(QtGui.QApplication.translate("dialog", "Ok", None, QtGui.QApplication.UnicodeUTF8))
        self.radioButton.setText(QtGui.QApplication.translate("dialog", "Calcola la serie di Fibonacci", None, QtGui.QApplication.UnicodeUTF8))
        self.radioButton_2.setText(QtGui.QApplication.translate("dialog", "Calcola la serie di Fibonacci in un intervallo", None, QtGui.QApplication.UnicodeUTF8))
        self.radioButton_3.setText(QtGui.QApplication.translate("dialog", "Calcola l\'ennesimo elemento della serie di Fibonacci", None, QtGui.QApplication.UnicodeUTF8))

def fibonacci():  
    a , b = 0, 1  
    while 1:  
        a, b = b, a + b  
        yield a

def chiedi_numeri(): 
    try:
            max_ = int(raw_input("Inserisci un numero: "))
            if max_ <= 0 :
                print "Il numero", max_, "non e' positivo!"
            else:
                start = 0  
                for i in fibonacci():  
                        if start > max_:
                            break
                        else:
                            start += 1
                            if start == max_:
                                    print  "Il", max_, "numero della sequenza di Fibonacci e'", i
    except ValueError:
            print "Non hai inserito un numero!"


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    dialog = QtGui.QDialog()
    ui = Ui_dialog()
    ui.setupUi(dialog)
    app.connect(ui.pushOk, Qt.SIGNAL("clicked()"), chiedi_numeri())
    dialog.show()
    sys.exit(app.exec_())
Теги:
pyqt4
pyqt

3 ответа

1

Когда вы подключаете сигнал к функции python, вы передаете объект функции. Другими словами, вы опускаете конечные скобки, поскольку вы передаете функцию, не вызывающую ее. Попробуйте изменить эту строку, чтобы прочитать app.connect(ui.pushOk, Qt.SIGNAL("clicked()"), chiedi_numeri)

0

от PyQt4 импорт QtCore, QtGui от импорта PyQt4.QtCore * из импорта PyQt4.QtGui *

попробовать:   _fromUtf8 = QtCore.QString.fromUtf8 кроме AttributeError:    _fromUtf8 = lambda s: s

класс Ui_Dialog (объект):   def setupUi (self, dialog):       dialog.setObjectName(_fromUtf8 ( "Диалог" ))       dialog.resize(600, 400)       самостоятельно. pushOk = QtGui.QPushButton(диалог)       self.pushOk.setGeometry(QtCore.QRect(200, 150, 75, 23))       self.pushOk.setObjectName( "Pushok" )

    self.radioButton = QtGui.QRadioButton(dialog)
    self.radioButton.setEnabled(True)
    self.radioButton.setGeometry(QtCore.QRect(60, 40, 261, 18))
    self.radioButton.setChecked(True)
    self.radioButton.setObjectName("radioButton")
    self.radioButton_2 = QtGui.QRadioButton(dialog)
    self.radioButton_2.setGeometry(QtCore.QRect(60, 70, 281, 18))
    self.radioButton_2.setObjectName("radioButton_2")
    self.radioButton_3 = QtGui.QRadioButton(dialog)
    self.radioButton_3.setGeometry(QtCore.QRect(60, 100, 281, 18))
    self.radioButton_3.setObjectName("radioButton_3")
    self.labelRisultato = QtGui.QLabel(dialog)
    self.labelRisultato.setGeometry(QtCore.QRect(70, 200, 261, 51))
    self.labelRisultato.setObjectName("labelRisultato")

    self.lineEdit = QtGui.QLineEdit(dialog)
    self.lineEdit.setGeometry(QtCore.QRect(240, 39, 150, 18))
    self.lineEdit.setStyleSheet(_fromUtf8("background-color: rgb(255, 255, 248);"))
    self.lineEdit.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
    self.lineEdit.setObjectName(_fromUtf8("lineEdit"))

    self.textEdit = QtGui.QTextEdit(dialog)
    self.textEdit.setGeometry(QtCore.QRect(10, 220, 250, 150))
    self.textEdit.setStyleSheet(_fromUtf8("background-color: rgb(220, 220, 220);font: 17pt \"Adobe Courier\";"))
    self.textEdit.setObjectName(_fromUtf8("textEdit"))



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


def retranslateUi(self, dialog):
    dialog.setWindowTitle(QtGui.QApplication.translate("dialog", "Fibonacci", None, QtGui.QApplication.UnicodeUTF8))
    self.pushOk.setText(QtGui.QApplication.translate("dialog", "Ok", None, QtGui.QApplication.UnicodeUTF8))
    self.radioButton.setText(QtGui.QApplication.translate("dialog", "Calcola la serie di Fibonacci", None, QtGui.QApplication.UnicodeUTF8))
    self.radioButton_2.setText(QtGui.QApplication.translate("dialog", "Calcola la serie di Fibonacci in un intervallo", None, QtGui.QApplication.UnicodeUTF8))
    self.radioButton_3.setText(QtGui.QApplication.translate("dialog", "Calcola l\'ennesimo elemento della serie di Fibonacci", None, QtGui.QApplication.UnicodeUTF8))

класс StaxQT4 (QtGui.QDialog):  def init (self):

    QtGui.QDialog.__init__(self)
    self.ui = Ui_Dialog()
    self.ui.setupUi(self)
    self.connect(self.ui.pushOk, QtCore.SIGNAL("clicked()"), self.chiedi_numeri)

def fibonacci (self):
  a, b = 0, 1
  а 1:
      a, b = b, a + b
      дают

def chiedi_numeri (self):   пытаться:            max_ = int (self.ui.lineEdit.text())           если max_ <= 0:               self.ui.lineEdit.setText( "Il numero% s non e 'positivo!" % str (max_))           еще:               start = 0
              для я в self.fibonacci():
                      если start > max_:                           ломать                       еще:                           start + = 1                           если start == max_:                       self.ui.textEdit.setText( "Il% s numero della sequenza di Fibonacci e '" % str (max_))                                   self.ui.textEdit.append(ул (я))   кроме ValueError:           self.ui.lineEdit.settext( "Non hai inserito un numero!" )

if name == " main":   import sys    app = QtGui.QApplication(sys.argv)

myapp = StaxQT4()
myapp.show()

sys.exit(app.exec_())
  • 0
    Хм, эта вставка копии на самом деле не работает, в основном вы хотите разделить класс настройки интерфейса Ui_Dialog и класс приложения StaxQT4, также остальные комментарии приведены правильно. Смотрите эту строку: self.connect (self.ui.pushOk, QtCore.SIGNAL ("clicked ()"), self.chiedi_numeri)
0

Одна вещь, которую вы делаете неправильно, находится в этой строке:

    app.connect(ui.pushOk, Qt.SIGNAL("clicked()"), chiedi_numeri())

Вы хотите, чтобы эта функция запускалась при нажатии кнопки, а не при соединении. Чтобы сделать это, удалите круглые скобки после chiedi_numeri:

    app.connect(ui.pushOk, Qt.SIGNAL("clicked()"), chiedi_numeri)

Это должно правильно подключить вашу кнопку.

Однако я не уверен, что вы подразумеваете под следующим:

Я вызываю chiedi_numeri(), он не показывает мне никакой формы

Что вы подразумеваете под формой? Ожидаете ли вы еще одного окна и попросите номер? На данный момент ваша программа запрашивает номер в окне терминала/оболочки/консоли, с которого вы запускали приложение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню