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”

AttributeError:“模块”对象没有属性“作者”

初学者 Python:AttributeError:'list' 对象没有属性

AttributeError: 'float' 对象没有属性 'split'

AttributeError:“列表”对象没有属性“numpy”