Maya Python脚本问题:点击Test Script按钮后窗口自动关闭
问题解决:Maya脚本点击按钮后窗口关闭的修复
问题根源
你的脚本里,每次点击「Test Script」按钮时,testScript函数会重新加载demoScript模块。而模块的顶层代码(所有函数外部的部分)包含了删除旧窗口、创建新窗口的逻辑,模块被reload时会从头执行所有顶层代码,导致原来的窗口被删除,但新窗口没有被调用显示,所以看起来窗口莫名关闭了。
修复方案
把窗口的创建逻辑移到gui()函数内部,让窗口的检查、创建只在调用gui()时执行,而不是模块加载/reload时自动触发。同时优化按钮回调里的代码,避免不必要的重复导入操作。
修改后的完整脚本
''' import demoScript import imp imp.reload (demoScript) demoScript.gui() ''' import re import maya.cmds as cmds import maya.mel as mel import maya.api.OpenMaya as om import math def gui(*args): # 将窗口检查、创建逻辑移到这里,仅在调用gui()时执行 if cmds.window("demoScriptWindow", exists=True): cmds.deleteUI("demoScriptWindow", window=True) myWindow = cmds.window("demoScriptWindow", t='DS Script Tester', rtf=1, w=100, h=100, toolbox=True) cmds.columnLayout(adjustableColumn=True) cmds.button(label= "Test Script", c=testScript) cmds.showWindow(myWindow) def testScript(*args): # 无需在回调里重复导入并reload模块,直接调用函数即可 demoScript('lf1','arm','Ik') def demoScript(side, limb, typ): ctrlN = "%s_%s%s_CTRL" % (side, limb, typ) print(ctrlN)
额外优化建议
如果确实需要在按钮点击时reload模块(比如你正在修改demoScript函数的逻辑,想实时生效),可以把业务逻辑和UI逻辑分离:单独写一个业务逻辑模块,在按钮回调里只reload业务模块,这样就不会影响UI窗口的状态。
内容的提问来源于stack exchange,提问作者Dasteel
相关产品推荐
相关产品推荐

