2017-07-31 16 views
0

私は現在、PythonでMaya用のUIスクリプトを作成しています。ファイルから別のUIオブジェクトへの呼び出し

私は上部に異なるタブを持つUIを持っていて、それはあまりにも厄介で長くなるので、コードのすべての部分をMainClassに入れたくありません。すべてのタブについて、そのスクリプトを別の.pyファイルに書きたいと思います。私は__init__の機能の下に接続を作成したい、同時に、このMainClassに別のスクリプトから関数を読み込みます。

質問:新しいファイルのUIからobjectNameを呼び出すにはどうすればよいですか? MainClassコードをインポートしようとしましたが、うまく機能せず、新しい.pyファイルのUIウィンドウを初期化したくありません。これを行うには良い方法がありますか?

EDIT

例:

test.uiファイルには、1つのボタンラベルされた "印刷" とリストウィジェットを持っています。 「Print」ボタンを押すたびに、リストウィジェットに「Hello World」と表示されます。

loadUi_test.pyではこれは動作しませんの.py

from pipeline import loadUi_test 
from pipeline import function_test 

uiFile = "test.ui" 
b = loadUi_test.loadUi(uiFile) 
a = loadUi_test.mainClass() 
a.pushButton.clicked.connect(function_test.printFunc(b)) 

のinitでfunction_test.py

def printFunc(): 
    listWidget.clear() 
    listWidget.addItem("Hello World!") 

def loadUi(uiFile): 
    #code that loads ui 

def getMayaWindow(): 
    #gets main Maya Window 

    ptr = apiUI.MQtUtil.mainWindow() 
    if ptr is not None: 
     return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow) 

class mainClass(): 
    def __init__(self, parent = getMayaWindow()): 

     super(pipeWindow,self).__init__(parent) 
     self.setupUi(self) 

    def closeEvent(self,event): 
     super(mainClass, self).closeEvent(event) 

ファイル、私は "エラーが出ますタプルオブジェクトには属性がありませんlistWidget "

私が代わりにこれを行う場合:a.pushButton.clicked.connect(function_test.printFunc(a))を、私はエラーを取得するには、「信号を接続に失敗しました)(クリック、」一般的に

+1

[別のファイルからクラスをインポートする](https://stackoverflow.com/questions/41276067/importing-class-from-another -file) – Matho

答えて

0

、あなたがいる限り、すべてのファイルがあなたのpythonで利用可能であるように、他のファイルからクラスをロードすることができますパス。 import文を使用してクラスをロードできます。

典型的なパターンの基本的な例は、__init__.pyで定義され、構成要素の部分が他のファイルに住んで、ディスクのメインツールはmytoolある

mytool 
| 
+--- __init__.py 
+--- model_tab.py 
+--- texture_tab.py 
+--- tool_tab.py 

に次のようになります。 from SomeModule import SomeClassパターンを使用してクラスをインポートできます。これにより、あなたの作品を別々のファイルに保存することが容易になります。あなたは、あなたがあなたの他のファイルで定義したクラスを使用して、実際のGUIを組み立てることができる場所にそれと__init__.py

from mytool.model_tab import ModelTab 
from mytoool.texture_tab import TextureTab 
from mytool.tool_tab import ToolTab 

にこのような輸入を構築したいです。あなたは__init__.pyにマスタークラスを入れたり、便利なように別のファイルに入れたりすることができます

+0

基本クラスを '__init __。py'ファイルの中に入れてみました。 'main.py'にinitモジュールをインポートして、' __init __。py'ファイルの中でクラスを呼び出さなければなりません。それはどうすればいいのでしょうか?それは私のものを '__init__の中に入れるという目的を破るからです。他の.pyファイルで '__init __。py'のクラスを使用しなければならない場合は、複数回初期化されます。 –

+0

あなたは複数回は初期化されません。複数の場所でクラス定義をインポートしますがインスタンスは一度だけ定義され、インスタンスの作成時に開始されます。既にインポートされている場合、Pythonはそのファイルを '再読み込み'しませんので、複数回インポートすると問題ありません。モジュールロード時に複雑なことをしたくない場合は、意図的に呼び出す関数に対して高価なものを節約します。 – theodox

+0

私はあなたが何を意味するのかなんて思っています。物事を単純化するために、私は3つのファイルを持っています。 '__init __。py'、' function_test.py'、 'loadUi_test.py'(コード例を示すために主な質問を編集しました)です。私の '__init __。py'には' from pipeline import function_test、loadUi_test'しかありません。 'function_test.py'と' loadUi_test.py'の中で、 'pipeline.function_test.printFunc()'を明示的に実行しなくても、 'import pipeline'を使ってメソッドにアクセスできるようにします。それは正しい?私は 'function_test.py'と' loadUi.py'をリンクして、pyqtのオブジェクト名にアクセスできるようにしたいと思います。 –

関連する問題