AttributeError: 'bool' object has no attribute 'le' -- pyqt -- getting text into python variable
AttributeError: 'bool' object has no attribute 'le' -- pyqt -- getting text into python variable
我使用 Qt Designer 创建了一个 UI,它有一个简单的线路输入和一个按钮。我尝试在 python 变量中获取行编辑的输入,但它抛出了一个错误。
这是我的 python 代码:
from PyQt4 import QtGui
import sys
import prog
import MySQLdb
class ExampleApp(QtGui.QMainWindow, prog.Ui_Program):
def __init__(self, parent=None):
super(ExampleApp, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(functioni)
def functioni (self):
db = MySQLdb.connect(host="localhost",
user="root",
passwd="*****",
db="testpy")
cur = db.cursor()
cur.execute("INSERT INTO Name (Name) VALUES (?)", self.le.text()) #self.le.text() is giving me trouble...
db.commit()
cur.close()
db.close()
def main():
app = QtGui.QApplication(sys.argv)
form = ExampleApp()
form.show()
app.exec_()
if __name__ == '__main__':
main()
我的 ui 代码是这样的:
self.le = QtGui.QLineEdit(self.centralwidget)
self.le.setObjectName(_fromUtf8("le"))
当我 运行 python 程序时,我得到这个错误:
Traceback (most recent call last):
File "main.py", line 20, in functioni
cur.execute("INSERT INTO Name (Name) VALUES (?)", self.le.displayText())
AttributeError: 'bool' object has no attribute 'le'
以前可能有人问过这个问题,但我已经尝试了所有方法,但还是不行!我不知道这里的 bool 是什么。该解决方案可能微不足道,但如果有人能指出我的错误,我将不胜感激。谢谢。
这是我的完整 ui 代码:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'prog.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!
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_Program(object):
def setupUi(self, Program):
Program.setObjectName(_fromUtf8("Program"))
Program.resize(351, 138)
Program.setLayoutDirection(QtCore.Qt.LeftToRight)
self.centralwidget = QtGui.QWidget(Program)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.formLayout = QtGui.QFormLayout(self.centralwidget)
self.formLayout.setObjectName(_fromUtf8("formLayout"))
self.label = QtGui.QLabel(self.centralwidget)
self.label.setObjectName(_fromUtf8("label"))
self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.label)
self.le = QtGui.QLineEdit(self.centralwidget)
self.le.setObjectName(_fromUtf8("le"))
self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.le)
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.pushButton)
Program.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(Program)
self.menubar.setGeometry(QtCore.QRect(0, 0, 351, 25))
self.menubar.setObjectName(_fromUtf8("menubar"))
self.menuSubmit = QtGui.QMenu(self.menubar)
self.menuSubmit.setObjectName(_fromUtf8("menuSubmit"))
Program.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(Program)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
Program.setStatusBar(self.statusbar)
self.toolBar = QtGui.QToolBar(Program)
self.toolBar.setObjectName(_fromUtf8("toolBar"))
Program.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
self.actionSubmit = QtGui.QAction(Program)
self.actionSubmit.setObjectName(_fromUtf8("actionSubmit"))
self.menuSubmit.addAction(self.actionSubmit)
self.menubar.addAction(self.menuSubmit.menuAction())
self.retranslateUi(Program)
QtCore.QMetaObject.connectSlotsByName(Program)
def retranslateUi(self, Program):
Program.setWindowTitle(_translate("Program", "Program", None))
self.label.setText(_translate("Program", "Name", None))
self.pushButton.setText(_translate("Program", "Submit", None))
self.menuSubmit.setTitle(_translate("Program", "Submit", None))
self.toolBar.setWindowTitle(_translate("Program", "toolBar", None))
self.actionSubmit.setText(_translate("Program", "Submit", None))
您误用了 "self" 参数,因为函数本身应该在 class 缩进中(因此,它应该是 class 的方法)或接收实例作为论据。
在您的代码中,functioni
将仅接收信号参数(所有按钮,包括 QPushButtons,都有一个已检查的参数)。这意味着您正在使用 False
作为参数调用 functioni
(单击后 QPushButton 的选中状态),并且 self
实际上是一个 bool 变量。请记住,self
只是python中的约定,它实际上是一个普通的位置参数,您可以随意调用它。
要解决您的问题,只需添加正确的缩进(并在信号连接中调用 self.functioni
),即可使 functioni
函数成为 class 方法。
如果出于任何原因,您需要将函数保留在 class 之外,您可以添加文本或 class 实例作为参数:
self.pushButton.clicked.connect(lambda checked: functioni(self.le.text())
self.pushButton.clicked.connect(lambda checked: functioni(self))
无关,但很重要。请记住,sqlite 的第二个 execute
参数必须是可迭代的(元组、列表等)。如果只有一个参数,可以在括号前加逗号得到单值元组:
cur.execute("INSERT INTO Name (Name) VALUES (?)", (self.le.text(), ))
我使用 Qt Designer 创建了一个 UI,它有一个简单的线路输入和一个按钮。我尝试在 python 变量中获取行编辑的输入,但它抛出了一个错误。 这是我的 python 代码:
from PyQt4 import QtGui
import sys
import prog
import MySQLdb
class ExampleApp(QtGui.QMainWindow, prog.Ui_Program):
def __init__(self, parent=None):
super(ExampleApp, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(functioni)
def functioni (self):
db = MySQLdb.connect(host="localhost",
user="root",
passwd="*****",
db="testpy")
cur = db.cursor()
cur.execute("INSERT INTO Name (Name) VALUES (?)", self.le.text()) #self.le.text() is giving me trouble...
db.commit()
cur.close()
db.close()
def main():
app = QtGui.QApplication(sys.argv)
form = ExampleApp()
form.show()
app.exec_()
if __name__ == '__main__':
main()
我的 ui 代码是这样的:
self.le = QtGui.QLineEdit(self.centralwidget)
self.le.setObjectName(_fromUtf8("le"))
当我 运行 python 程序时,我得到这个错误:
Traceback (most recent call last):
File "main.py", line 20, in functioni
cur.execute("INSERT INTO Name (Name) VALUES (?)", self.le.displayText())
AttributeError: 'bool' object has no attribute 'le'
以前可能有人问过这个问题,但我已经尝试了所有方法,但还是不行!我不知道这里的 bool 是什么。该解决方案可能微不足道,但如果有人能指出我的错误,我将不胜感激。谢谢。
这是我的完整 ui 代码:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'prog.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!
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_Program(object):
def setupUi(self, Program):
Program.setObjectName(_fromUtf8("Program"))
Program.resize(351, 138)
Program.setLayoutDirection(QtCore.Qt.LeftToRight)
self.centralwidget = QtGui.QWidget(Program)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.formLayout = QtGui.QFormLayout(self.centralwidget)
self.formLayout.setObjectName(_fromUtf8("formLayout"))
self.label = QtGui.QLabel(self.centralwidget)
self.label.setObjectName(_fromUtf8("label"))
self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.label)
self.le = QtGui.QLineEdit(self.centralwidget)
self.le.setObjectName(_fromUtf8("le"))
self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.le)
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.pushButton)
Program.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(Program)
self.menubar.setGeometry(QtCore.QRect(0, 0, 351, 25))
self.menubar.setObjectName(_fromUtf8("menubar"))
self.menuSubmit = QtGui.QMenu(self.menubar)
self.menuSubmit.setObjectName(_fromUtf8("menuSubmit"))
Program.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(Program)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
Program.setStatusBar(self.statusbar)
self.toolBar = QtGui.QToolBar(Program)
self.toolBar.setObjectName(_fromUtf8("toolBar"))
Program.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
self.actionSubmit = QtGui.QAction(Program)
self.actionSubmit.setObjectName(_fromUtf8("actionSubmit"))
self.menuSubmit.addAction(self.actionSubmit)
self.menubar.addAction(self.menuSubmit.menuAction())
self.retranslateUi(Program)
QtCore.QMetaObject.connectSlotsByName(Program)
def retranslateUi(self, Program):
Program.setWindowTitle(_translate("Program", "Program", None))
self.label.setText(_translate("Program", "Name", None))
self.pushButton.setText(_translate("Program", "Submit", None))
self.menuSubmit.setTitle(_translate("Program", "Submit", None))
self.toolBar.setWindowTitle(_translate("Program", "toolBar", None))
self.actionSubmit.setText(_translate("Program", "Submit", None))
您误用了 "self" 参数,因为函数本身应该在 class 缩进中(因此,它应该是 class 的方法)或接收实例作为论据。
在您的代码中,functioni
将仅接收信号参数(所有按钮,包括 QPushButtons,都有一个已检查的参数)。这意味着您正在使用 False
作为参数调用 functioni
(单击后 QPushButton 的选中状态),并且 self
实际上是一个 bool 变量。请记住,self
只是python中的约定,它实际上是一个普通的位置参数,您可以随意调用它。
要解决您的问题,只需添加正确的缩进(并在信号连接中调用 self.functioni
),即可使 functioni
函数成为 class 方法。
如果出于任何原因,您需要将函数保留在 class 之外,您可以添加文本或 class 实例作为参数:
self.pushButton.clicked.connect(lambda checked: functioni(self.le.text())
self.pushButton.clicked.connect(lambda checked: functioni(self))
无关,但很重要。请记住,sqlite 的第二个 execute
参数必须是可迭代的(元组、列表等)。如果只有一个参数,可以在括号前加逗号得到单值元组:
cur.execute("INSERT INTO Name (Name) VALUES (?)", (self.le.text(), ))