我是个新手,刚刚开始学习Python编程:
import sys
from PyQt5 import QtWidgets
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWindow = QtWidgets.QMainWindow()
mainWindow.show()
sys.exit(app.exec_())
当我运行上面的代码时,每个都可以。但当我运行下面的代码时它失败了,并显示以下错误消息:app=PyQt5.QtWidgets.QApplication(sys.argv)AttributeError:"module"对象没有属性"QtWidgets"
import sys
import PyQt5
if __name__ == "__main__":
app = PyQt5.QtWidgets.QApplication(sys.argv)
mainWindow = PyQt5.Qtwidgets.QmainWindow()
mainWindow.show()
sys.exit(app.exec_())
顺便说一下,我的Python版本是2.7,我使用的是Qt5库,我的操作系统是OpenSUSE 13.2,当然是Linux的发行版。
PyQt5
部分只是为一组模块提供了一个名称空间。它本身不包含任何内容,因此您无法直接从中导入任何内容。
这是一个深思熟虑的设计决定,而且是有充分理由的。包中可能总共有30个或更多模块,因此每次导入PyQt5
本身时都要加载所有模块,这将是一项繁重的前期成本。因此,我们的目的是只支付加载您实际需要的模块的费用。
但是,有时您确实希望同时加载所有模块。例如,在python交互式会话中进行实验时,能够做到这一点将非常方便。事实上,PyQt提供了一个特殊的模块来做到这一点:
>>> from PyQt5 import Qt
>>> Qt.QWidget
<class 'PyQt5.QtWidgets.QWidget'>
>>> Qt.QObject
<class 'PyQt5.QtCore.QObject'>
>>> Qt.QNetworkCookie
<class 'PyQt5.QtNetwork.QNetworkCookie'>
Qtwidgets
文件是PyQt5
目录中已编译的.so
文件,与所有模块一样,__init__.py
文件中没有导入,因此需要使用from。。。
使用目录py3
中的cython编译文件test1.cpython-34m.so
和空__init.__py
的示例显示了相同的行为:
In [1]: import py3
In [2]: py3.test1
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-2-9aa45b2a49b6> in <module>()
----> 1 py3.test1
AttributeError: 'module' object has no attribute 'test1'
In [3]: from py3 import test1
In [4]: test1.foo()
Out[4]: 100
PyQt5中的文件如下:
/usr/lib/python3/dist-packages/PyQt5$ ls
__init__.py
__pycache__
_QOpenGLFunctions_2_0.cpython-34m-x86_64-linux-gnu.so
QtCore.cpython-34m-x86_64-linux-gnu.so
Qt.cpython-34m-x86_64-linux-gnu.so
QtDBus.cpython-34m-x86_64-linux-gnu.so
QtDesigner.cpython-34m-x86_64-linux-gnu.so
QtGui.cpython-34m-x86_64-linux-gnu.so
QtHelp.cpython-34m-x86_64-linux-gnu.so
QtNetwork.cpython-34m-x86_64-linux-gnu.so
QtOpenGL.cpython-34m-x86_64-linux-gnu.so
QtPrintSupport.cpython-34m-x86_64-linux-gnu.so
QtTest.cpython-34m-x86_64-linux-gnu.so
QtWidgets.cpython-34m-x86_64-linux-gnu.so
uic
使用cat
可以看到__init__.py
:中没有导入
$:/usr/lib/python3/dist-packages/PyQt5$ cat __init__.py
# Copyright (c) 2014 Riverbank Computing Limited <info@riverbankcomputing.com>
#
# This file is part of PyQt5.
#
# This file may be used under the terms of the GNU General Public License
# version 3.0 as published by the Free Software Foundation and appearing in
# the file LICENSE included in the packaging of this file. Please review the
# following information to ensure the GNU General Public License version 3.0
# requirements will be met: http://www.gnu.org/copyleft/gpl.html.
#
# If you do not wish to use this file under the terms of the GPL version 3.0
# then you may purchase a commercial license. For more information contact
# info@riverbankcomputing.com.
#
# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
因此,当您尝试使用PyQt5.Qtwidgets
时,由于__init__.py
中没有导入,您会看到错误,因为模块显然没有属性。
如果在__init__.py
中添加了类似from . import QtWidgets
的内容,则可以使用import PyQt5 PyQt5.Qtwidgets
或PyQt5.Qtwidgets
。在从包PyQt5
导入模块Qtwidgets
时,也可以使用空白init。
你可以看到,当你import PyQt5
时,你实际上有一个模块:
In [6]: import PyQt5
In [7]: type(PyQt5)
Out[7]: module
因此,真正的区别以及您看到所做输出的原因是,在第二个示例中,您试图从模块导入,在第一个示例中尝试从package导出。