You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Autodesk Maya外部加载Python脚本时界面不显示问题

问题根因

你的判断完全准确,故障点就是if __name__ == "__main__":的判断逻辑:

  • 在Maya内置脚本编辑器中直接执行代码时,当前运行上下文的__name__变量值固定为"__main__",判断条件成立,后续创建、弹出窗口的代码会正常执行。
  • 当脚本作为外部模块通过import/reload方式加载时,模块自身的__name__值为导入时的模块名,也就是hdri_browser_script_v1,和"__main__"不相等,判断块内的窗口初始化、显示逻辑完全不会被触发,因此不会弹出界面,也不会抛出任何报错。
解决方法

推荐采用封装显示函数的方案,同时兼容直接运行、模块导入两种工作流:

  1. 修改外部脚本文件,把窗口创建显示的逻辑抽成独立公开函数,保留原有的直接运行自启动逻辑,参考修改后的完整代码结构:
    # 补全必要的依赖导入(如果你的脚本里已经写了可以忽略)
    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()
    
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:24:27