2016-10-17 6 views
3

私のpythonアプリケーションは、さまざまな別々の処理アルゴリズム/モジュールを1つの(Py)Qt GUI内で組み合わせて構成されています。インポートされたモジュール内での外部クラスメソッドの使用

すべての処理アルゴリズムは、独自のモジュール内にあり、GUIエレメントを使用するすべての通信は、メインモジュール内の単一クラス内で実装されます。 特に、このGUIクラスには、選択したアルゴリズムの現在の処理の進行状況を表すプログレスバー(QProgressBar)オブジェクトがあります。 このオブジェクトは.setValue()メソッド(self.dlg.progressBar.setValue(int))を持っています。

self.dlg.progressBar.setValue()は、インポートされた処理モジュール内でクラスメソッドであるため、進捗状況を独自のコードで報告することができないという問題があります。

私が見つけた唯一の回避策は、各処理モジュールの定義に変数progressbarを追加し、self.dlg.progressBarをメインモジュール内に渡してから、処理モジュール内で盲目的にprogressbar.setValue(%some_processing_var%)を呼び出します。

これは、インポートされたモジュール内で外部クラスメソッドを使用する唯一の方法ですか、それとも良い方法がありますか?

答えて

5

いいえ。このアプローチでは、ソフトウェア工学の原則(たとえば、single responsibility)が多少壊れていると思います。単一責任の原則では、各モジュールは割り当てられたタスクのみを担当し、その他は何もしません。 UIを別のレイヤーと見なすと、処理モジュールはUIレイヤーとは関係がありません。

この場合、モジュールにはpublish_progress(callback)というメソッドがあります。callbackは、各進捗ステップ(more info)で呼び出される関数です。次に、UIレイヤーで整数(0〜100)が与えられ、進行状況バーが更新される関数を定義します。定義したら、モジュールのpublish_progressメソッドで登録する必要があります。

def progress_callback(prg): 
    self.dlg.progressBar.setValue(prg) 

は、それを登録する:HI-IM-frogatto @

progress_callback(0) 
... 
# do something 
... 
progress_callback(20) 
... 
# do something 
... 
progress_callback(100) 
+0

私はアイデアを得ていると思うが、まだあります

my_module.publish_progress(progress_callback) 

は、あなたのモジュールでコールバックを呼び出します私が理解していないことはほとんどありません。 ** 1。 Main(GUI)モジュール:** a)GUIクラス内で 'progress_callback'を定義する必要がある場合、定義に' self'がないのはなぜですか? b)メインコードのどこに登録陳述書を置く必要がありますか? ** 2。処理モジュール:** a)処理関数内で、または別のメソッドとして 'publish_progress'を定義する必要がありますか? b)あなたの種類の返答に基づいて、すべての実際の作業は 'progress_callback'によって行われます。これはメインモジュールからインポートします。では、この 'publish_progress'メソッドは何をすべきですか? – Vasily

+1

@Vasily ** 1.a:**いいえ、 'progress_callback'は' Main'クラスの_method_ではありません。代わりに、mainメソッドの1つの中で定義できるローカル関数です。 ** 1.b:**登録ステートメントは、UI初期化の直後(または他のどこか)にある可能性があります。 ** 2.a:**処理クラスのメソッドである可能性があります。 (またはそのモジュールの機能)。 ** 2.b:** 'publish_progress'は単なるレジスタ関数/メソッドであり、他には何もしません。まだ不明な点がある場合は、お気軽にお問い合わせください。 –

+1

@Vasilyこのアプローチは、コールバックパターンの一種です。 [Wikipediaで確認してください](https://en.wikipedia.org/wiki/Callback_(computer_programming))。 –

関連する問題