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

Maya Python使用undoInfo()后撤销功能失效问题求解

问题根因
  • 变量赋值逻辑错误:你代码中self.slider_released = self.ui.slider.sliderReleased是将Qt的sliderReleased信号对象直接赋值给了变量,而非用来标记滑块是否释放的布尔变量,while not self.slider_released的判断逻辑完全不成立,会直接进入无限卡死状态。
  • 主线程阻塞异常:空的while循环会完全占满Maya的主线程资源,Maya的UI事件响应、命令队列调度、撤销栈维护全部运行在主线程上,主线程被卡死时,你已经调用了cmds.undoInfo(openChunk=True)打开了撤销块,但后续的cmds.undoInfo(closeChunk=True)永远无法执行,导致Maya撤销栈一直处于未完成状态,最终抛出撤销不可用的错误。
  • 设计逻辑不符合Qt框架规则:Qt是事件驱动框架,不需要通过轮询的方式等待控件事件触发,直接使用信号槽绑定事件回调即可。
修复方案
  1. 调整初始化逻辑,绑定信号槽替代轮询:
super(winMain, self).__init__()
loader = QtUiTools.QUiLoader()
self.ui = loader.load(ui_path, self)
# 缓存滑块当前值的变量
self.current_slider_val = 0
# 绑定滑块值变化信号,仅更新缓存不执行修改
self.ui.slider.valueChanged.connect(lambda val: setattr(self, "current_slider_val", val))
# 绑定滑块释放信号到实际执行逻辑
self.ui.slider.sliderReleased.connect(self.exec_modify)
  1. 实现修改执行逻辑,保证撤销块成对出现:
def exec_modify(self):
    cmds.undoInfo(openChunk=True, chunkName="Slider Param Modify")
    try:
        # 调用参数写入逻辑
        self.action(self.current_slider_val)
    finally:
        # 无论是否报错都关闭撤销块,避免撤销栈异常
        cmds.undoInfo(closeChunk=True)

内容的提问来源于stack exchange,提问作者galaxy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:48:03