【问题标题】:AttributeError: 'class_c' object has no attribute 'lineEdit'AttributeError:“class_c”对象没有属性“lineEdit”
【发布时间】:2015-12-27 16:26:55
【问题描述】:

我有一个 gui 应用程序

  1. 我将文本放入文本框中,然后单击按钮,
  2. moduel_b.py 中的函数callprinttext() 被调用。
  3. 函数callprinttext()调用moduel_c.py中的方法printtext()

但我有一个错误:

 AttributeError: 'class_c' object has no attribute 'lineEdit'

谁能帮助我class_c? 这是代码:

module_c.py

class class_c (object):
     def __init__(self, parent=None):
       self.parent=parent

 ### I want a fix for error here
     def printtext (self):
          t=unicode(self.lineEdit.text()) 
          print t

module_b.py

import sys
from GUI import Ui_MainWindow
from PyQt4 import QtCore, QtGui
class calss_b (object):
     def __init__(self, parent=None):
      pass

     def callprinttext (self):
         from module_c import class_c
         instance_c=class_c()
         instance_c.printtext()

main.py

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys
from GUI import Ui_MainWindow
class MainWindow(QtGui.QMainWindow,Ui_MainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        from module_b import calss_b
        global instance_b
        instance_b=calss_b(self)
        QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL("clicked()"), instance_b.callprinttext )


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    global myapp
    myapp = MainWindow()
    myapp.show()
    sys.exit(app.exec_())

图形界面

  # -*- coding: utf-8 -*-


    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_MainWindow(object):
        def setupUi(self, MainWindow):
            super(Ui_MainWindow, self).__init__()
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
            MainWindow.resize(800, 600)
            self.centralwidget = QtGui.QWidget(MainWindow)
            self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
            self.pushButton = QtGui.QPushButton(self.centralwidget)
            self.pushButton.setGeometry(QtCore.QRect(340, 110, 75, 23))
            self.pushButton.setObjectName(_fromUtf8("pushButton"))
            self.lineEdit = QtGui.QLineEdit(self.centralwidget)
            self.lineEdit.setGeometry(QtCore.QRect(390, 240, 151, 20))
            self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtGui.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
            self.menubar.setObjectName(_fromUtf8("menubar"))
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtGui.QStatusBar(MainWindow)
            self.statusbar.setObjectName(_fromUtf8("statusbar"))
            MainWindow.setStatusBar(self.statusbar)

            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)

        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
            self.pushButton.setText(_translate("MainWindow", "PushButton", None))

【问题讨论】:

  • 好吧,class_c 没有lineEdit 属性。是什么让您认为它确实有效?
  • 我想把项目分成几个部分。
  • 所以我假设您想将 lineEdit 中的内容作为文本传递给 printtext

标签: python user-interface methods


【解决方案1】:

嗯,一种方法是使用回调方法,这样:

main.py

QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL("clicked()"), self.call_back)

def call_back(self):
    txt = str(self.ui.lineEdit.text()) #lineEdit.text() returns QString Object so we need to convert it to String object
    instance_b.callprinttext(txt)

然后在你的calss_b 方法中:

def callprinttext (self, txt):
    from module_c import class_c
    instance_c=class_c()
    instance_c.printtext(txt)

最后在您的class_c 方法中:

def printtext (self, txt):
    t=unicode(txt) 
    print t

编辑:

如果您不想添加任何回调方法,请使用lambda,这样:

QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL("clicked()"), \
                       lambda: instance_b.callprinttext(self.ui.lineEdit.text()))

而且不需要call_back

【讨论】:

  • AttributeError: 'MainWindow' 对象没有属性 'lineEdit'
  • 并且,我不想在 main.py 中添加函数
  • 我的目标:减少main.py中的函数数量
  • 我需要将 main.py 用于有限的功能(信号和运行应用程序),
  • @AhmadAli...在您按下pushButton 之前,您在lineEdit 中写了什么吗?...
猜你喜欢
  • 1970-01-01
  • 2012-12-01
  • 2021-04-19
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多