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是事件驱动框架,不需要通过轮询的方式等待控件事件触发,直接使用信号槽绑定事件回调即可。
修复方案
- 调整初始化逻辑,绑定信号槽替代轮询:
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)
- 实现修改执行逻辑,保证撤销块成对出现:
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
相关产品推荐
相关产品推荐

