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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:43:24