关于python:将UI对象从文件调用到另一个文件

Calling UI objects from a file into another

我目前正在用python为maya编写一个UI脚本。

所以,我有一个在顶部有不同标签的UI,我不想把每一段代码都放在MainClass中,因为这太混乱和太长了。对于每个选项卡,我想将其脚本写在不同的.py文件中。我想在__init__函数下创建连接,同时将函数从另一个脚本加载到这个MainClass中以供使用。

问题是,如何在新文件中从UI调用objectname?我试图导入MainClass代码,但这不起作用,我不希望在新的.py文件中初始化UI窗口。解决这个问题的好方法是什么?

编辑

例子:

test.ui文件有一个标记为"打印"的按钮和一个列表小部件。每次按下"打印"按钮,"Hello World"将出现在列表小部件上。

在loadui_test.py文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)

功能测试中

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

in in .pY

1
2
3
4
5
6
7
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))

这不起作用,我得到一个错误"tuple对象没有属性listwidget"

如果我改为这样做:a.pushButton.clicked.connect(function_test.printFunc(a)),我会得到错误"failed to connect signal clicked()"


通常,只要所有文件都在您的python路径上可用,就可以从其他文件加载类。可以使用import语句加载类。

典型模式的一个基本示例在磁盘上如下所示

1
2
3
4
5
6
mytool
|
+---  __init__.py
+--- model_tab.py
+--- texture_tab.py
+--- tool_tab.py

其中,主工具是mytool,在__init__.py中定义,组件块位于其他文件中。可以使用from SomeModule import SomeClass模式导入类。这使得把你的作品放在单独的文件里变得容易。你可以在__init__.py中构造这样的进口。

1
2
3
from mytool.model_tab import ModelTab
from mytoool.texture_tab import TextureTab
from mytool.tool_tab import ToolTab

这样,您就可以使用在其他文件中定义的类来组装实际的GUI。你可以把你的主班放在__init__.py里,或者放在一个单独的文件里,这似乎很方便。