2016-09-04 5 views
2

私のアプリケーションでは、整列(Qt::AlignBottom)などのウィジェットパラメータを設定する必要があります。しかし、私はそれらをインポートすることはできません(他のPyQt5スタッフの輸入に問題はありません)。私はエラー以下しまっQt :: namespase(Qt5、Python3.x)からインポートするには?

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) 

私はsollutionを働いてきたけれども、私は唯一のインポートしたいですQt.AlignBottomであり、*ではありません。そして、なぜQt.AlignBottomfrom PyQt5 import Qtで動作しませんか?

答えて

3

docsを読むことをお勧めしますPyQtにQtという特別な仮想モジュールがあり、すべてを1つの名前空間にインポートします。これは非常に便利な機能ですが、QtCore.Qtという名前の衝突は避けられませんでした。

最初の例では、若干奇妙に見えるQt.Qt.AlignBottomを使用して、エラーを「固定」することができます。しかし明らかに、QtCoreから明示的にインポートする方がずっと良い解決策です。 PyQt5パッケージが遅延ローダーであることに気づく価値があるので、import PyQt5は他のモジュールへのアクセスなしで空の名前空間をインポートするだけです。

1

あなたはこの

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

を行うことができますあなただけAlignBottomをインポートすることはできませんQtCoreはパッケージ自体ではないので、それはそれ自身の上だけのモジュール(単一ファイル)です。それは、すべてのパッケージは、モジュールがあることを知っておくことが重要ですが、すべてではないのモジュールはパッケージが

ので、これはあなたが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'> 
>>> 

動作しませんですAlignBottomが含まれている他のクラスとメソッドが含まれているクラスQtを参照してください。 otherhand PyQt5で

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

パッケージ(他のモジュールを含むフォルダ)である点を、それは__init__.py

だと私はあなたが私は混乱を考えるモジュールと、このSO質問

+2

ここで混乱するのは、PyQtには 'Qt'という特別な仮想モジュールがあり、*すべて*を単一の名前空間にインポートするということです。これは非常に便利な機能ですが、 'QtCore.Qt'との名前の衝突は避けられませんでした。 OPの最初の例では、幾分不思議な 'Qt.Qt.AlignBottom'を使ってエラーを「修正」することができます。しかし明らかに、 'QtCore'から明示的にインポートする方がずっと良い解決策です。 PyQt5パッケージは* lazy loader *なので、import PyQt5は他のモジュールにアクセスすることなく空の名前空間をインポートするだけです。 – ekhumoro

+0

@ echumoro、答えとしてあなたのコメントを投稿すれば私はそれを受け入れます。 –

関連する問題