#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. Код работает, если вы просто удаляете команды кнопок, вызывающие функции, которые не существуют. И это на самом деле отвечает на вопрос.