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(), ))