2017-08-29 17 views
0

私は、Pythonでかなり大きなプロジェクトを作るために、プログラムMayaを使用しています。私は、GUIによって決定され、ユーザによる入力となる多数のオプションを持っています。 オプションの一例は、レンダリングする寸法です。しかし、私はまだGUIを作っていないし、まだテストの夢中です。gui変数をクラスに効率的に渡す方法は?

私が最終的に望むのは、複数のモジュール内のさまざまなクラス/メソッドによって変数を参照して使用できるようにする方法です。また、実際のGUIを持たずにすべてのコードをテストできる方法があることも覚えておいてください。

すべてのデータを各メソッドに直接渡す必要がありますか?私の問題は、メソッドfooが変数Aに依存しているが、メソッドバーがfooを呼び出す必要がある場合、呼び出されたどこからでもこれらの変数をFooに渡すことができます。

私が見た別の方法は、すべての変数を各クラスインスタンスに渡し、インスタンス変数を使用してアクセスすることでした。しかし、オプションが変更されたら、実行するたびに読み込みを再ロードする必要があります。

私が今使っているのは、変数を含む設定ファイルから変数を取得するモジュールです。そのモジュールをインポートし、スクリプト全体でインスタンス変数を使用します。

def __init__(self): 
     # Get and assign all instance variables. 
     options = config_section_map('Attrs', '%s\\ui_options.ini' %(data_path)) 
     for k, v in options.items(): 
      if v.lower() == 'none': 
       options[k] = None 
     self.check_all = int(options['check_all']) 
     self.control_group = options['control_group'] 

誰もがアドバイスを持っているのですか、またはui変数の取得/使用を扱う正しい方向に私を指摘できますか?

+0

あなたのロジックとUIの間のハイレベルなインターフェース層である 'Session'または' Interface'クラスを考えてみてください。独自のメソッドまたは他のクラスのメソッドを呼び出すことによって、必要なすべての変数管理を処理できます。代わりに、他のクラスへのアクセスを直接提供することもできます。コードを実行するときは、セッションを開始してすべてのロジックを初期化し、そのセッションにセッションを渡してUIを起動します。あなたのコードをヘッドレスで使用する場合は、UIレイヤーを削除して直接セッションと対話するか(テスト用)、別の特殊レイヤー(CLI)を追加するだけです。 – mapofemergence

+0

ありがとう、私はそれを試してみよう! –

答えて

2

オプションリストが長すぎるものではなく、変更されません場合は、あなたは、単に読者が理解するための初期化が容易になり、クラス初期化子、中にメンバ変数を設定することができます:あなたが予想される場合は

class OptionData(object): 


    def __init___(self): 
     #set the options on startup 

     self.initial_path = "//network" 
     self.initial_name = "filename" 
     self.use_hdr = True 
     # ... etc 

を多くの場合、あなたはクラスのコンストラクタに初期値を分割することができます変更するには、初期化:あなたは、データを永続化する必要がある場合は、あなたがやっているように、あなたはcfgファイルを読み込み、クラスを記入することができます

class OptionData(object): 


    def __init___(self, path = "//network", name = "filename", hdr=True) 

    self.initial_path = path 
    self.initial_name = name 
    self.use_hdr = hdr 

、またはそれ以外の方法で保管してください。永続化すると、ユーザーが2つのMayaを同時に開かないことを保証できないため、予測できない方法で保存されたデータを変更する可能性があるため、作業が難しくなります。 MayaのfileInfoを使用して、データのファイルごとのコピーを保存できます。

これらの両方の場合、私は実際のGUIにデータオブジェクト(など)を初期化子として使用させます。そうすれば、GUIからデータを読み書きすることができます。そして、実際の機能コードはOptionDataを読んだ:

def perform_render(optiondata): 
    #.... etc 

あなたはすべて、機能コードをGUIなしでバッチ処理を実行することができますこの方法はどれも賢明になることはありません。 GUIの唯一の仕事は、データオブジェクトのカスタムエディタであり、それを有効な状態の最終関数に渡すことです。

関連する問題