Почему deleteUI не работает в Maya Python с этим скриптом?

#python #python-2.7 #maya

#python #python-2.7 #maya

Вопрос:

У меня возникли некоторые проблемы с этим скриптом, который я написал на 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()
  

Ответ №1:

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

Правильный способ сделать это в этом случае — записать имя окна в переменной при его создании, а затем использовать это сохраненное имя. Вы можете сделать это довольно элегантно, используя closure: функцию 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’. Учитывая трудности, связанные с тем, чтобы вы всегда знали правильное имя пути к жестко запрограммированным элементам пользовательского интерфейса, это редко стоит хлопот.

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

Комментарии:

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

Ответ №2:

ВОТ РАБОЧИЙ СКРИПТ MAYA PYTHON.

введите описание изображения здесь

Вы не должны использовать 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 )
  

Ответ №3:

 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()
  

Комментарии:

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