How to import from Qt:: namespase (Qt5, Python3.x)?
I think the confusion here is that PyQt has a special virtual module called Qt
, which imports everything into a single namespace. This is a quite useful feature, but it's a real shame that the name clash with QtCore.Qt
wasn't avoided.
In the first example, the error can be "fixed" by using the somewhat weird-looking Qt.Qt.AlignBottom
. But obviously, explicitly importing from QtCore
is a much better solution. It's also worth noting that the PyQt5
package is a lazy loader, so import PyQt5
will just import an empty namespace with no access to the other modules.
You can do this
>>> from PyQt5.QtCore import Qt
>>> Qt.AlignBottom
64
>>>
You can't import AlignBottom
only because QtCore is not a package itself, it's just a module on it's own (a single file). it's important to know that all packages are modules, but not all modules are packages
so this won't work
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'>
>>>
Looking at the output you can see that QtCore
is a single file which contains a class Qt
that contains other classes and methods on which AlignBottom
is part of, you can see that with.
>>> from PyQt5.QtCore import Qt
>>> help(Qt)
On the otherhand PyQt5 is a package (folder containing other modules) points to it's __init__.py
i'll suggest you read the docs on Modules and this SO question