2017-07-31 63 views
0

我目前正在寫的Python爲瑪雅UI腳本。調用UI對象到另一個

所以,我有UI在頂部有不同的選項卡,我不想在MainClass中放置每一個代碼片段,因爲那太亂了,太長了。對於每一個標籤,我想寫的劇本在不同.py文件。我想在__init__函數下創建連接,同時將另一個腳本的函數裝載到此MainClass中以供使用。

的問題是,我應該如何去在一個新的文件從UI調用對象名?我試圖導入MainClass代碼,但沒有工作,我不希望在新.py文件中的初始化UI窗口。有什麼好辦法可以解決這個問題?

EDIT

實施例:

test.ui文件有一個按鈕標記爲 「打印」 和列表窗口小部件。每按一次'打印'按鈕,單詞「Hello World」就會出現在列表小部件上。

在loadUi_test.py文件

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) 

在function_test.py

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

初始化的.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)) 

這是不行的,我得到一個錯誤「元組對象有沒有屬性listWidget「

如果我這樣做,而不是:a.pushButton.clicked.connect(function_test.printFunc(a)),我得到的錯誤「無法連接信號點擊()」

+1

可能重複[從另一個文件導入類](https://stackoverflow.com/questions/41276067/importing-class-from-another -file) – Matho

回答

0

在一般情況下,您可以加載其他文件,只要所有的文件都可以在你的Python類路徑。您可以使用import語句加載一個類。

典型圖案的一個基本的例子是這樣的磁盤上

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

其中的主要工具是mytool,在__init__.py定義和組分片住在其他文件。您可以使用from SomeModule import SomeClass模式導入班級。這可以很容易地將你的作品保存在單獨的文件中。你會結構中進口像這樣__init__.py

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

由於在地方,你可以使用您已在其他文件中定義的類集合實際GUI。你可以把你的主類放在__init__.py或者看起來很方便的單獨文件中

+0

我試着把我的基類放在'__init __。py'文件中。我必須在'main.py'中導入我的init模塊來調用'__init __。py'文件中的類。這是怎麼回事?因爲這樣做會把我的東西放在'__init__中。py',因爲如果必須在另一個.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'中,我會執行'import pipeline'來相互訪問方法,而不顯式執行'pipeline.function_test.printFunc()'。是對的嗎?我希望能夠鏈接我的'function_test.py'和'loadUi.py',以便我可以訪問pyqt的對象名。 –

相關問題