我是Python的新手,我想做一个简单的代码来在按下QPushButton时在Python控制台中打印消息。我将代码分成2个.py文件(一个用于UI,另一个用于主应用程序)。虽然它应该是很简单的,但我仍然没有设法使它工作。
我很确定这是一个初学者的错误,但我不能找到什么是错误的,当我检查答案从相关的帖子,甚至比较类似的代码从其他帖子在这个论坛。
"从主测试!","从主测试-第二次!"one_answers"从编辑测试!"打印行出现在控制台上,但我不知道为什么当单击按钮时不调用其他两个。我猜我做了一些错误的click .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_())
你得到这个错误是因为MyForm实例没有在代码的任何地方声明。您正在调用该类的init中的函数,但该类尚未实例化。
在这些情况下,最好在Ui_Dialog类中创建一个函数,该函数在单击按钮时实例化该类,并在构造函数中调用该函数,以打印结果。
代码中的两个问题:
-
不能创建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_())
(我没有考虑布局,但你可以)