Я хотел бы удалить кнопку с всплывающим меню, вызываемым правой кнопкой мыши.
Моя текущая установка дает сбой, возможно, в cmds.deleteUI...
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)
#-- Create some buttons that needs to be deleted with a popupmenu
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...")
#-- How to delete the button without crashing?!
print("Now delete the button please..")
#cmds.deleteUI( button, control=True ) # <<-- This crashes maya
MayaWindow()
Я нашел функцию "evalDeferred", но не знаю, как ее использовать в этой настройке.
Проблема в том, что при выполнении команды Maya пытается удалить элемент пользовательского интерфейса, пока он еще используется, что приводит к сбою. Вы примерно разобрались. Вот ваш код с evalDeferred
выполнением выражения deleteUI.
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)
#-- Create some buttons that need to be deleted with a popupmenu
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..")
cmds.evalDeferred(lambda: cmds.deleteUI(button, control=True)) # <<-- This should no longer crash Maya
MayaWindow()
Это связано с тем, что при использовании: cmds.evalDeferred(cmds.deleteUI(button, control=True))
команда cmds.deleteUI(button, control=True)
выполняется немедленно, и ее возвращаемое значение — это то, что фактически передается команде evalDeferred.
Работает как шарм! Я действительно был очень близок. Пропущена функциональность "лямбда:". Это передать переменные в отложенную функцию?!