按下QPushButton时打印控制台消息

时间:2015-05-21 09:13:39

标签: python pyqt4 qpushbutton

我是Python的新手,我想在按下QPushButton时在Python控制台中打一个简单的代码来打印消息。我将代码拆分为2个.py文件(一个用于UI,另一个用于主应用程序)。虽然它应该很简单,但我仍然没有设法让它发挥作用。

我很确定这是一个初学者的错误,但是当我查看相关帖子的答案或者甚至与此论坛中其他帖子的类似代码进行比较时,我无法找到问题所在。

"测试来自主要!","测试来自主要 - 第二次!"和#34;从编辑进行测试!"打印线出现在控制台上,但我不知道为什么在点击按钮时没有调用其他两个。我猜我在使用clicked.connect()方法做错了。

非常坦克。

文件的代码如下:

UI代码:

from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *

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_Dialog(object):

    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(850, 450)     

        self.pushButton_2 = QtGui.QPushButton(Dialog)
        self.pushButton_2.setGeometry(QtCore.QRect(100, 60, 251, 61))
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))

        self.pushButton_Selection = QtGui.QPushButton(Dialog)
        self.pushButton_Selection.setGeometry(QtCore.QRect(148, 250, 161, 61))
        self.pushButton_Selection.setObjectName(_fromUtf8("pushButton_Selection"))  

        self.retranslateUi(Dialog)        

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Communication", None))        
        self.pushButton_2.setText(_translate("Dialog", "Print Line", None))        
        self.pushButton_Selection.setText(_translate("Dialog", "Select sensor", None))        

        print "Test from edit!"

主文件代码:

import sys
import PyQt4.QtCore as QtCore
import PyQt4.QtGui as QtGui

from EditTxt_ui import Ui_Dialog

print "Test from main!"

class MyForm(QtGui.QMainWindow, Ui_Dialog):
    def __init__(self, parent=None):
        super(MyForm, self).__init__(parent)
        self.ui.setupUi(self)

        self.pushButton_2.clicked.connect(self.print_LineEdit)
        self.pushButton_Selection.clicked.connect(self.print_Selection)

    print "Test from main - 2nd time!"

    def print_LineEdit(self):
        print "Print from LineEdit!"

    def print_Selection(self):                      
        print "Print Selection!"            

if __name__ == "__main__":  
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_Dialog()
    ui.setupUi(MainWindow)
    MainWindow.show()    
    sys.exit(app.exec_())

2 个答案:

答案 0 :(得分:1)

您收到此错误,因为MyForm实例未在代码中的任何位置声明。您正在调用该类'init中的函数,但该类未实例化。

在这些情况下,最好在Ui_Dialog类中创建一个函数,在单击按钮时实例化类并调用构造函数中的函数,以打印结果。

答案 1 :(得分:0)

代码中存在两个问题:

  • 您不会创建MyForm类的实例。

  • 按钮是在Ui_Dialog类中创建的,但您尝试从MyForm访问它们。

如果你想访问MyForm中的按钮,你必须在MyForm中创建一个Ui_Dialog实例,如下所示:

class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyForm, self).__init__(parent)

        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

        self.ui.pushButton_2.clicked.connect(self.print_LineEdit)
        self.ui.pushButton_Selection.clicked.connect(self.print_Selection)

    def print_LineEdit(self):
        print "Print from LineEdit!"

    def print_Selection(self):                      
        print "Print Selection!"            

if __name__ == "__main__":  
    app = QtGui.QApplication(sys.argv)
    MainWindow = MyForm()
    MainWindow.show()    
    sys.exit(app.exec_())

另一个解决方案是将函数print_LineEdit和print_Selection放在类Ui_Dialog中。

但是对于像这样的非常简单的应用程序,我会将主文件中的所有内容放在一个类中,如下所示:

import sys
import PyQt4.QtCore as QtCore
import PyQt4.QtGui as QtGui

class MyForm(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyForm, self).__init__(parent)

        self.pushButton_2=QtGui.QPushButton("Print Line")
        self.pushButton_Selection=QtGui.QPushButton("Select sensor")

        self.pushButton_2.clicked.connect(self.print_LineEdit)
        self.pushButton_Selection.clicked.connect(self.print_Selection)

        #layout
        vbox=QtGui.QVBoxLayout()
        vbox.addWidget(self.pushButton_2)
        vbox.addWidget(self.pushButton_Selection)
        self.setLayout(vbox)

    def print_LineEdit(self):
        print "Print from LineEdit!"

    def print_Selection(self):                      
        print "Print Selection!"            

if __name__ == "__main__":  
    app = QtGui.QApplication(sys.argv)
    MainWindow = MyForm()
    MainWindow.show()    
    sys.exit(app.exec_())

(我没有打扰布局,但你可以)