【问题标题】:Calling UI objects from a file into another将 UI 对象从一个文件调用到另一个文件中
【发布时间】:2017-07-31 04:46:45
【问题描述】:

我目前正在用 Python 为 Maya 编写 UI 脚本。

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

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

编辑

例子:

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!")

init.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)),我会收到错误“无法连接信号 clicked()”

【问题讨论】:

标签: python user-interface pyqt maya


【解决方案1】:

通常,只要所有文件都在您的 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 或者在一个单独的文件中,看起来很方便

【讨论】:

  • 我尝试通过将我的基类放在__init__.py 文件中来做到这一点。我必须在main.py 中导入我的init 模块才能调用__init__.py 文件中的类。应该是这样吗?因为这违背了将我的东西放在 __init__.py 中的目的,因为如果我必须在另一个 .py 文件中使用来自 __init__.py 的类,我将进行多次初始化
  • 您不会多次初始化:您将在多个位置导入类定义,但只会在创建实例时定义一次并初始化。如果文件已经导入,Python 不会“重新加载”文件,因此可以多次导入。你不想在模块加载上做任何复杂的事情——为你故意调用的函数节省昂贵的东西。
  • 我想我有点明白你的意思。为简单起见,我有 3 个文件。 __init__.pyfunction_test.pyloadUi_test.py(我已经编辑了主要问题以显示代码示例)。在我的__init__.py 中,我应该只有from pipeline import function_test, loadUi_test。例如,在function_test.pyloadUi_test.py 中,我执行import pipeline 以便能够在不明确执行pipeline.function_test.printFunc() 的情况下相互访问方法。是对的吗?我希望能够链接我的 function_test.pyloadUi.py 以便我可以访问 pyqt 的对象名。
  • 从另一个文件(类或函数)导入的任何内容都将与您在本地定义的行为相同。因此,您可以很好地创建或使用来自另一个文件的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多