evalDeferred で回避!

リーフ数 2
1

UI 系

2

ウィンドウ自体に対して deleteUI コマンド showWindow コマンド が実行された場合、Maya で致命的なエラーが発生しますする時がある。
そんなときは、
evalDeferred を使用して回避できる。

http://help.autodesk.com/view/MAYAUL/2017/JPN//?guid=GUID-C97BBDE6-A2E4-4C13-B1D9-79ACF55B0758

import maya.cmds as cmds
# from functools import partial

class UI(object):
    @classmethod
    def showUI(cls):
        win = cls()
        win.createUI()
        return win

    def __init__(self):
        self.win = 'testUi'
    
    def createUI(self, *args):
        if cmds.window(self.win, q = True, ex = True):
            # cmds.evalDeferred(lambda *args:cmds.deleteUI(self.win))
            cmds.deleteUI(self.win)
        cmds.window(self.win)
        cmds.columnLayout(adj = True)
        cmds.button(label = 'close ui', c = self.close)  # partial(self.createUI)
        cmds.button(label = 'reload ui', c = self.reload)  # partial(self.createUI)
        # cmds.showWindow(self.win)
        cmds.evalDeferred(lambda *args:cmds.showWindow(self.win))

    def reload(self, *args):
        self.showUI()
        print('reload done')
        
    def close(self, *args):
        cmds.evalDeferred(lambda *args:cmds.deleteUI(self.win))
        print('close done')   
        
    
if __name__ == '__main__':
    print(u'{}.py: loaded as script file'.format(__name__))
    UI.showUI()
else:
    print(u'{}.py: loaded as module file'.format(__name__))
import maya.cmds as cmds
# from functools import partial

class UI(object):
    def __init__(self):
        self.win = 'testUi'
    
    def createUI(self, *args):
        if cmds.window(self.win, q = True, ex = True):
            # cmds.evalDeferred(lambda *args:cmds.deleteUI(self.win))
            cmds.deleteUI(self.win)
        cmds.window(self.win)
        cmds.columnLayout(adj = True)
        cmds.button(label = 'close ui', c = self.close)  # partial(self.close)
        cmds.button(label = 'reload ui', c = self.reload)  # partial(self.reload)
        # cmds.showWindow(self.win)
        cmds.evalDeferred(lambda *args:cmds.showWindow(self.win))

    def reload(self, *args):
        self.createUI()
        print('reload done')
        
    def close(self, *args):
        cmds.evalDeferred(lambda *args:cmds.deleteUI(self.win))
        print('close done')   
        
    
if __name__ == '__main__':
    print(u'{}.py: loaded as script file'.format(__name__))
    UI().createUI()
else:
    print(u'{}.py: loaded as module file'.format(__name__))