Maya Python:删除带右键弹出菜单的按钮时程序崩溃如何解决?
解决Maya中删除带右键菜单按钮崩溃的问题
问题原因
直接在右键菜单的命令里删除按钮会导致Maya崩溃,核心原因是右键菜单本身还处于事件处理流程中,此时修改它依附的UI控件会干扰Maya的UI事件循环,引发冲突。
解决方案
使用cmds.evalDeferred()将删除操作延迟到当前事件循环完成后执行。该函数会把传入的操作放入Maya的待执行队列,等右键菜单的事件处理全部完成(比如菜单关闭)后再执行删除,彻底避免UI状态冲突。
修改后的完整代码:
import maya.cmds as cmds import functools class MayaWindow(): def __init__(self): self.WINDOW_NAME = "Maya Window" if cmds.window(self.WINDOW_NAME, exists=True): cmds.deleteUI(self.WINDOW_NAME, window=True) self.window = cmds.window(self.WINDOW_NAME) # 创建带右键删除菜单的按钮 cmds.frameLayout(label='Buttons') for i in range(10): button = cmds.button(label=str(i)) cmds.popupMenu() cmds.menuItem( label='Delete Button', command=functools.partial(self.deleteButton, button)) cmds.showWindow(self.window) def deleteButton(self, button, *args): print("Execute some code...") print("Now delete the button please..") # 用evalDeferred延迟执行删除操作 cmds.evalDeferred(lambda: cmds.deleteUI(button, control=True)) MayaWindow()
关键说明
- 用lambda表达式包裹删除命令,确保按钮的名称能正确传递给
evalDeferred; - 延迟执行的逻辑会让Maya先处理完右键菜单的所有交互事件,再执行控件删除,从根源上规避崩溃问题。
内容的提问来源于stack exchange,提问作者Jim de Brouwer
相关产品推荐
相关产品推荐

