AttributeError: 'bool' 对象没有属性 'le' -- pyqt -- 将文本输入 python 变量
Posted
技术标签:
【中文标题】AttributeError: \'bool\' 对象没有属性 \'le\' -- pyqt -- 将文本输入 python 变量【英文标题】:AttributeError: 'bool' object has no attribute 'le' -- pyqt -- getting text into python variableAttributeError: 'bool' 对象没有属性 'le' -- pyqt -- 将文本输入 python 变量 【发布时间】:2017-12-25 14:14:03 【问题描述】:我使用 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()
我的用户界面代码是这样的:
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'
这个问题之前可能已经被问过,但我已经尝试了所有方法,但它不起作用!我不知道这里是什么布尔值。解决方案可能是微不足道的,但如果有人能指出我的错误,我将不胜感激。谢谢。
这是我的完整用户界面代码:
# -*- 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))
【问题讨论】:
你在尝试什么。请问你想要 functioni 作为类成员函数吗?还是全局函数?因为你在函数中传递 self 作为参数并且函数位于类之外 【参考方案1】:您误用了“self”参数,因为函数本身应该在类缩进中(因此,它应该是类的方法)或接收实例作为参数。
在您的代码中,functioni
将只接收信号参数(所有按钮,包括 QPushButtons,都有一个选中的参数)。这意味着您正在调用functioni
并以False
作为参数(单击后QPushButton 的选中状态),而self
实际上将是一个布尔变量。请记住self
只是python中的一个约定,它实际上是一个普通的位置参数,你可以随意调用它。
要解决您的问题,通过添加正确的缩进(并在信号连接中调用self.functioni
)使functioni
函数成为类方法就足够了。
如果出于任何原因,您需要将函数留在类之外,您可以添加文本或类实例作为参数:
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(), ))
【讨论】:
另外,在我看来,我必须使用 ...VALUES (%s)", ... 而不是 ? 无论如何它都应该与问号一起使用(这比百分号更好更安全)。 我试过 (?) 但它一直给我 SQL 语法错误。以上是关于AttributeError: 'bool' 对象没有属性 'le' -- pyqt -- 将文本输入 python 变量的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError:“NumpyArrayIterator”对象没有属性“类”
AttributeError:“模块”对象没有属性“WebSocketApp”
初学者 Python:AttributeError:'list' 对象没有属性