2011-05-28 121 views
1

我有一个问题使用pyqt4: 这里是我正在使用的代码,重点是,如果在pushOk按钮的事件处理程序中点击我呼叫chiedi_numeri()它不会显示我任何形式,而如果我调用chiedi_numeri()它说,参数3和QObjectConnect具有无效类型。我该如何解决它? 感谢pyqt4按钮点击处理程序

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_()) 

回答

1

当把信号连接到一个Python函数,传递函数对象。换句话说,由于您传递的函数没有调用它,因此您会省略后面的括号。试着改变上面一行改为app.connect(ui.pushOk, Qt.SIGNAL("clicked()"), chiedi_numeri)

0

有一件事你做错了,是在这一行:

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

希望此功能按钮被按下时运行,而不是当连接而成。为此,请在chiedi_numeri后删除括号:

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

然后,应该正确连接按钮。

不过,我不知道你下面的意思:

I call chiedi_numeri() it does not show me any form

你是什么意思的“形式”呢?你是否期待另一个窗口弹出并询问一个号码?目前,您的程序要求您在启动应用程序的终端/外壳/控制台窗口中输入一个数字。

0

从PyQt4的进口QtCore,QtGui 从PyQt4.QtCore进口* 从PyQt4.QtGui进口*

尝试: _fromUtf8 = QtCore.QString.fromUtf8 除AttributeError的: _fromUtf8 =拉姆达S:小号

类Ui_Dialog(对象): DEF setupUi(个体,对话): dialog.setObjectName(_fromUtf8( “对话”)) dialog.resize(600,400) self.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 初始化(个体):

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

DEF斐波纳契(个体):
A,b = 0,1
而1:
A,b = b,A + b
得到

DEF chiedi_numeri(个体): 尝试: MAX_ = INT(self.ui.lineEdit.text()) 如果MAX_ < = 0: self.ui.lineEdit.setText(“IL NUMERO %s non e'positivo!“%str(max_)) else: start = 0
对于我自己。斐波纳契():
如果开始> MAX_: 断裂 否则: 启动+ = 1 如果开始== MAX_: self.ui.textEdit.setText( “IL%S NUMERO德拉SEQUENZA二斐波E'” % STR(MAX_)) self.ui.textEdit.append(STR(I)) 除了ValueError异常: self.ui.lineEdit.settext()

如果 = “非海inserito未NUMERO!” =“main”: import sys app = QtGui.QApplication(sys。 ARGV)

myapp = StaxQT4() 
myapp.show() 

sys.exit(app.exec_()) 
+0

嗯,这个复制粘贴并未真正发挥作用,基本上你要分开的界面设置类Ui_Dialog和应用程序类 StaxQT4,也给其他的评论是正确的 看到这一行: 自我。连接(self.ui.pushOk,QtCore.SIGNAL(“clicked()”),self.chiedi_numeri) – dero 2011-05-28 14:04:27