2016-10-11 2 views
1

У меня возникли некоторые проблемы с этим скриптом, который я написал в Maya Python! Я хочу иметь возможность вызвать функцию для закрытия пользовательского интерфейса, нажав кнопку. Я осмотрелся как здесь, так и на других сайтах, и я не могу заставить его работать. Ничего не происходит, когда я нажимаю кнопку «Закрыть».Почему deleteUI не работает в Maya Python с этим скриптом?

def closeUI(*args): 

    if (cmds.window('mainWindow', exists=True)): 
     cmds.deleteUI('mainWindow') 


def mainWindow(*args): 

    closeUI() 

    mainWindow = cmds.window(title="Auto-rig", widthHeight=(300, 300), s=False, vis=True, toolbox=True) 
    cmds.columnLayout(adjustableColumn=True) 

    cmds.button(label='Create Joints (1 of 3)', command=createJoints, en=True) 

    cmds.button(label='Create IK (2 of 3)', command=createIk, en=True) 

    cmds.button(label='Create Controls (3 of 3)', command=createControls, en=True) 

    cmds.button(label='Close', command=closeUI, en=True) 

mainWindow() 

ответ

0
def del_win(win_id, *args) 
    if cmds.window(win_id, query=True, exists=True): 
     # add type of UI element, window, layout, control 
     cmds.deleteUI(win_id, window=True) 
window = cmds.window("main_win", title="Auto-rig") 

del_win("main_win") 

или

del_win(window) 

обратно в код

from functools import partial 
def closeUI(win_id, *args): 
    if (cmds.window(win_id, exists=True)): 
     cmds.deleteUI(win_id, window=True) 

def main_Window(*args): 

    cmds.window("mainWindow", title="Auto-rig", widthHeight=(300, 300), s=False, vis=True, toolbox=True) 
    cmds.columnLayout(adjustableColumn=True) 
    cmds.button(label='Create Joints (1 of 3)', command=createJoints, en=True) 
    cmds.button(label='Create IK (2 of 3)', command=createIk, en=True) 
    cmds.button(label='Create Controls (3 of 3)', command=createControls, en=True) 
    cmds.button(label='Close', command=partial(closeUI, "mainWindow"), en=True) 
    cmds.showWindow("mainWindow") 
main_Window() 
+0

Вы проверили свой код? Он не работает вообще ... – andy

+0

Код работает, если вы просто удалите команды кнопок, вызывающие функции, которые не существуют. И это на самом деле отвечает на вопрос. – UKDP

1

ЗДЕСЬ РАБОТАЕТ MAYA PYTHON SCRIPT.

enter image description here

Вы не должны использовать def main_Window(*args) для текущего скрипта.

import maya.cmds as maya 

def createJoints(*args): 
    print 'createJoints button was pushed.' 

def createIk(*args): 
    print 'createIK button was pushed.' 

def createControls(*args): 
    print 'createControls button was pushed.' 

def closeWindow(*args):  
    print 'mayaWindow was closed.' 

    if (maya.window(mayaWindow, exists=True)): 
    maya.deleteUI(mayaWindow, control=True) 

mayaWindow = maya.window(title="Auto-rig", widthHeight=(300, 300), s=False, vis=True, toolbox=True) 
maya.columnLayout(adjustableColumn=True) 
maya.button(label='Create Joints...(1 of 3)', command=createJoints, en=True) 
maya.button(label='Create IK...(2 of 3)', command=createIk, en=True) 
maya.button(label='Create Controls...(3 of 3)', command=createControls, en=True) 
maya.button(label='Close', command=closeWindow, en=True) 
maya.showWindow(mayaWindow) 
2

Вы должны быть осторожны с использованием строковых ссылок на виджеты Maya gui - вам не гарантировано получить имя, которое вы просили. Поэтому даже если ваш код пытается создать окно с именем «X», вы можете получить окно под названием «X1», и если у вас есть ссылка с жесткой кодировкой, вы никогда не найдете «X1»

Правильный путь для этого в этом случае нужно записать имя окна в переменной, когда оно создано, а затем использовать это сохраненное имя. Вы можете сделать это довольно элегантно, используя закрытие: функция python, которая позволяет функции «захватывать» значение переменной, которая присутствовала во время объявления. вот очень простой пример, который использует затворы и игнорирует окна идентификаторов:

import maya.cmds as cmds 

def create_window(): 
    window = cmds.window(title='Main Window') 
    column = cmds.columnLayout() 
    button = cmds.button("Delete me") 

    def close_handler(*_): 
     cmds.deleteUI(window) # 'window' is captured by the closure 

    cmds.button(button, e=True, command = close_handler) 

    cmds.showWindow(window) 
    return window 

create_window() 

Если вы хотите, чтобы помнить, что фактический идентификатор главного окна, просто сохранить результат «create_window». Учитывая трудности, связанные с тем, что вы всегда знаете правильное имя пути жестко закодированных элементов пользовательского интерфейса, он редко стоит проблем.

Вы можете и должны расширять использование затворов, чтобы иметь дело с другими видами связи между битами и частями вашего пользовательского интерфейса. В большинстве случаев это проще и менее подвержено ошибкам, чем попытка управлять всем этим с жестко закодированными строками.

+0

Спасибо! Это определенно помогает! – RasmusJBjork

Смежные вопросы