Autodesk Maya外部加载Python脚本时界面不显示问题
问题根因
你的判断完全准确,故障点就是if __name__ == "__main__":的判断逻辑:
- 在Maya内置脚本编辑器中直接执行代码时,当前运行上下文的
__name__变量值固定为"__main__",判断条件成立,后续创建、弹出窗口的代码会正常执行。 - 当脚本作为外部模块通过
import/reload方式加载时,模块自身的__name__值为导入时的模块名,也就是hdri_browser_script_v1,和"__main__"不相等,判断块内的窗口初始化、显示逻辑完全不会被触发,因此不会弹出界面,也不会抛出任何报错。
解决方法
推荐采用封装显示函数的方案,同时兼容直接运行、模块导入两种工作流:
- 修改外部脚本文件,把窗口创建显示的逻辑抽成独立公开函数,保留原有的直接运行自启动逻辑,参考修改后的完整代码结构:
# 补全必要的依赖导入(如果你的脚本里已经写了可以忽略) from maya.OpenMayaUI import MQtUtil from shiboken2 import wrapInstance from PySide2 import QtWidgets def maya_main_window(): main_win_ptr = MQtUtil.mainWindow() return wrapInstance(int(main_win_ptr), QtWidgets.QWidget) class TestDialog(QtWidgets.QDialog): def __init__(self, parent=maya_main_window()): super(TestDialog, self).__init__(parent) self.setWindowTitle('My Window') self.setMinimumWidth(435) self.setMinimumHeight(500) # (...) 其余原有业务逻辑不变 def show_ui(): # 声明全局变量持有窗口实例,避免被Python垃圾回收导致窗口消失 global test_dialog try: test_dialog.close() test_dialog.deleteLater() except: pass test_dialog = TestDialog() test_dialog.show() # 保留脚本直接在编辑器运行时的自启动能力 if __name__ == "__main__": show_ui() - 修改Maya内的模块加载代码,导入/reload完成后主动调用显示函数即可:
from importlib import reload import hdri_browser_script_v1 reload(hdri_browser_script_v1) # 主动触发窗口显示 hdri_browser_script_v1.show_ui()
注意:不要省略全局变量持有窗口实例的逻辑,否则PySide/PyQt创建的窗口会被Python自动垃圾回收,出现窗口一闪而过或者完全不显示的问题。
内容的提问来源于stack exchange,提问作者johancc
相关产品推荐
相关产品推荐

