python - Qt 框架、PyQt5 和 AttributeError : 'MyApp' object has no attribute 'myAttribute'

标签 python qt user-interface pyqt5 qmainwindow

上周我开始学习 Python,并开发了一些命令行应用程序。现在我想用 GUI 开发应用程序。我在互联网上搜索并找到了一个符合我需要的项目:Qt Project ( http://qt-project.org ) 和 PyQt ( http://www.riverbankcomputing.com/software/pyqt/intro )。我在 Mac OS X 10.10 和 python 2.7.6 上安装了 Qt 5.3.2 Open Source、SIP 4.16.4、PyQt5 5.3.2。在安装 Qt 和 PyQt 的一些麻烦之后,我终于设法让它们工作了。如果我从 PyQt 示例文件夹打开示例项目,则 gui 出现时没有任何问题。所以我用 Qt Creator 创建了我的 GUI,然后我用 pyuic5 生成了 python 代码。这是 pyuic5 创建的(文件名“myapp_auto.py”):

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

# Form implementation generated from reading ui file '/Users/andrea/Developer/Qt/mainwindow.ui'
#
# Created: Mon Nov 17 14:20:14 2014
#      by: PyQt5 UI code generator 5.3.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(400, 300)
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.centralWidget.setObjectName("centralWidget")
        self.ok = QtWidgets.QPushButton(self.centralWidget)
        self.ok.setGeometry(QtCore.QRect(140, 120, 115, 32))
        self.ok.setAccessibleName("")
        self.ok.setObjectName("ok")
        self.text = QtWidgets.QLabel(self.centralWidget)
        self.text.setGeometry(QtCore.QRect(100, 70, 181, 16))
        self.text.setAccessibleName("")
        self.text.setAlignment(QtCore.Qt.AlignCenter)
        self.text.setObjectName("text")
        self.time = QtWidgets.QDateTimeEdit(self.centralWidget)
        self.time.setGeometry(QtCore.QRect(100, 180, 194, 24))
        self.time.setAccessibleName("")
        self.time.setObjectName("time")
        MainWindow.setCentralWidget(self.centralWidget)
        self.menuBar = QtWidgets.QMenuBar(MainWindow)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 22))
        self.menuBar.setObjectName("menuBar")
        self.menuMyApp = QtWidgets.QMenu(self.menuBar)
        self.menuMyApp.setObjectName("menuMyApp")
        self.menuEdit = QtWidgets.QMenu(self.menuBar)
        self.menuEdit.setObjectName("menuEdit")
        MainWindow.setMenuBar(self.menuBar)
        self.mainToolBar = QtWidgets.QToolBar(MainWindow)
        self.mainToolBar.setObjectName("mainToolBar")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
        self.statusBar = QtWidgets.QStatusBar(MainWindow)
        self.statusBar.setObjectName("statusBar")
        MainWindow.setStatusBar(self.statusBar)
        self.menuBar.addAction(self.menuMyApp.menuAction())
        self.menuBar.addAction(self.menuEdit.menuAction())

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.ok.setText(_translate("MainWindow", "Ok"))
        self.text.setText(_translate("MainWindow", "I\'m a GUI"))
        self.menuMyApp.setTitle(_translate("MainWindow", "MyApp"))
        self.menuEdit.setTitle(_translate("MainWindow", "Edit"))

之后,我添加了一个新的 python 文件,用于放置我的代码;这是我写的(文件名“myapp.py”):

#!/usr/bin/env python

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from myapp_auto import Ui_MainWindow
import sys
import time


class MyApp(Ui_MainWindow):

    parse_triggered = pyqtSignal()

    def __init__(self, parent=None, name=None):
        Ui_MainWindow.__init__(self)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = MyApp()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

然后,我运行 myapp.py 并验证所有 GUI 元素似乎都在它们应有的位置。好吧……现在我的问题来了:我试图用代码访问 MainWindow 中的“时间”元素,这样修改了 init def:

def __init__(self, parent=None, name=None):
            Ui_MainWindow.__init__(self)

            # Set the date to now
            now = QDateTime()
            now.setTime_t(int(time.time()))
            self.time.setDateTime(now)

但是编译器总是显示这个错误:

AttributeError: 'MyApp' object has no attribute 'time'

即使我尝试访问任何其他元素(“ok”、“text”)也会发生这种情况。 肯定会是一个愚蠢的错误,但我无法弄清楚我哪里出错了。 谢谢大家! 祝你有美好的一天,

安德里亚

最佳答案

离你不远了。

MyApp类需要继承QMainWindow,不需要使用time模块。尝试这样的事情:

class MyApp(QMainWindow, Ui_MainWindow):
    parse_triggered = pyqtSignal()

    def __init__(self, parent=None, name=None):
        super(MyApp, self).__init__(parent)
        self.setupUi(self)
        # Set the date to now
        self.time.setDateTime(QDateTime.currentDateTime())

if __name__ == "__main__":

    app = QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())

关于python - Qt 框架、PyQt5 和 AttributeError : 'MyApp' object has no attribute 'myAttribute' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26974120/

相关文章:

python - 有没有办法从 matplotlib 曲面图导出 STL 文件?

python - 在 Flask-Mongoengine 中切换集合并保存

c++ - OpenCV2.2 cvCaptureFromCAM 问题...只返回绿屏。 (罗技 C260 摄像头)

c++ - Qt 是否支持虚拟纯插槽?

android:background ="?buttonSelectableBackground", "?"是什么意思?

python - LSTM 网络期望最后一层的目标具有 2 维,但得到形状为 (996, 1, 1) 的数组

python - 如何使用 Google S2 几何执行搜索操作

java - 尝试更新我的 JFrame,为什么重绘不起作用?

c++ - 读取四字节字符

ios - 如何在一行中正确添加两个按钮和一个标签?