如何从Qt :: namesase(Qt5,Python3.x)导入?

SS_*_*ous 5 python qt python-3.x pyqt5

对于我的应用程序,我需要设置一些小部件参数,例如alignment(Qt::AlignBottom)和其他。但是我无法导入它们(其他PyQt5素材导入没有任何问题)。

使用此代码

from PyQt5 import Qt

progressBar = QProgressBar(splash)
progressBar.setAlignment(Qt.AlignBottom)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Traceback (most recent call last):
  File "run_app.py", line 50, in <module>
    runSemApp(sys.argv)
  File "run_app.py", line 32, in runSemApp
    progressBar.setAlignment(Qt.AlignBottom)
AttributeError: 'module' object has no attribute 'AlignBottom'
Run Code Online (Sandbox Code Playgroud)

并使用此作品:

from PyQt5.Qt import *

progressBar = QProgressBar(splash)
progressBar.setAlignment(Qt.AlignBottom)
Run Code Online (Sandbox Code Playgroud)

尽管我有一个可行的解决方案,但我只想导入Qt.AlignBottom而不能*。另外,为什么不Qt.AlignBottom一起工作from PyQt5 import Qt

ekh*_*oro 7

我认为这里的困惑在于PyQt有一个称为的特殊虚拟模块Qt,该模块将所有内容导入单个名称空间。这是一个非常有用的功能,但令人遗憾的QtCore.Qt是,没有避免与该名称发生冲突。

在第一个示例中,可以通过使用看起来有些奇怪的外观来“修复”错误Qt.Qt.AlignBottom。但是显然,显式导入QtCore是一个更好的解决方案。还值得注意的是,该PyQt5软件包是一个惰性加载器,因此import PyQt5将仅导入一个空的名称空间,而不能访问其他模块。


dan*_*dee 5

你可以这样做

>>> from PyQt5.QtCore import Qt
>>> Qt.AlignBottom
64
>>>
Run Code Online (Sandbox Code Playgroud)

你不能导入AlignBottom只是因为 QtCore 本身不是一个包,它只是它自己的一个模块(单个文件)。重要的是要知道所有包都是模块,但并非所有模块都是包

所以这行不通

import PyQt5.QtCore.Qt

ImportError: No module named 'PyQt5.QtCore.Qt'; 'PyQt5.QtCore' is not a package
>>> import PyQt5.QtCore
>>> QtCore
<module 'PyQt5.QtCore' from '/usr/lib/python3.5/site-packages/PyQt5/QtCore.so'>
>>> import PyQt5
>>> PyQt5
<module 'PyQt5' from '/usr/lib/python3.5/site-packages/PyQt5/__init__.py'>
>>>
Run Code Online (Sandbox Code Playgroud)

查看输出,您可以看到这QtCore是一个包含一个类的单个文件,该类Qt包含其他类和方法的AlignBottom一部分,您可以看到它。

>>> from PyQt5.QtCore import Qt
>>> help(Qt)
Run Code Online (Sandbox Code Playgroud)

另一方面,PyQt5 是一个包(包含其他模块的文件夹)指向它的 __init__.py

我建议你阅读关于 Modules的文档和这个SO问题

  • 我认为这里的困惑在于 PyQt 有一个名为 `Qt` 的特殊虚拟模块,它将 *所有内容* 导入到单个命名空间中。这是一个非常有用的功能,但很遗憾没有避免与`QtCore.Qt` 的名称冲突。在 OPs 第一个示例中,可以通过使用看起来有些奇怪的 `Qt.Qt.AlignBottom` 来“修复”错误。但显然,从`QtCore` 显式导入是一个更好的解决方案。还值得注意的是,PyQt5 包是一个*延迟加载器*,因此`import PyQt5` 只会导入一个空命名空间,而无法访问其他模块。 (3认同)