【问题标题】:How to import from Qt:: namespase (Qt5, Python3.x)?如何从 Qt:: 命名空间(Qt5,Python3.x)导入?
【发布时间】:2017-01-12 00:05:42
【问题描述】:

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

使用此代码

from PyQt5 import Qt

progressBar = QProgressBar(splash)
progressBar.setAlignment(Qt.AlignBottom)

我收到以下错误:

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'

并且使用这个有效:

from PyQt5.Qt import *

progressBar = QProgressBar(splash)
progressBar.setAlignment(Qt.AlignBottom)

虽然我有一个可行的解决方案,但我只想导入 Qt.AlignBottom 而不是 *。另外,为什么Qt.AlignBottom 不能与from PyQt5 import Qt 一起使用?

【问题讨论】:

    标签: python qt python-3.x pyqt5


    【解决方案1】:

    我认为这里的混淆在于 PyQt 有一个名为 Qt 的特殊虚拟模块,它将 everything 导入单个命名空间。这是一个非常有用的功能,但很遗憾没有避免名称与QtCore.Qt 发生冲突。

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

    【讨论】:

      【解决方案2】:

      你可以这样做

      >>> from PyQt5.QtCore import Qt
      >>> Qt.AlignBottom
      64
      >>>
      

      您不能仅导入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'>
      >>>
      

      查看输出,您可以看到 QtCore 是一个包含类 Qt 的单个文件,其中包含 AlignBottom 所属的其他类和方法,您可以看到。

      >>> from PyQt5.QtCore import Qt
      >>> help(Qt)
      

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

      我建议你阅读关于模块的 docs 和这个 SO 问题

      【讨论】:

      • 我认为这里的混淆是 PyQt 有一个特殊的虚拟模块,称为 Qt,它将 everything 导入到单个命名空间中。这是一个非常有用的功能,但很遗憾没有避免名称与QtCore.Qt 发生冲突。在 OP 的第一个示例中,可以使用看起来有些奇怪的 Qt.Qt.AlignBottom 来“修复”错误。但显然,从QtCore 显式导入是一个更好的解决方案。还值得注意的是,PyQt5 包是一个惰性加载器,所以import PyQt5 只会导入一个空的命名空间,而不能访问其他模块。
      • @ekhumoro,如果您发表评论作为答案,我会接受。
      猜你喜欢
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 2017-01-25
      • 2012-06-01
      • 1970-01-01
      相关资源
      最近更新 更多