Buscar..


Parámetros

parámetro detalles
e / editar le dice a Maya que desea cambiar el valor de una propiedad existente
q / consulta le dice a Maya que desea obtener el valor de una propiedad existente

Observaciones

Maya incluye un kit de herramientas de IU bastante completo que incluye ventanas, diseños y una variedad de controles. Esto se implementa utilizando el marco QT en C ++, pero expuesto a los usuarios de MEL y Python a través del conjunto de comandos predeterminado de Maya.

QT

Los usuarios avanzados pueden extender la interfaz de usuario Maya utilizando C ++ o Python. Las versiones mayas de 2012 a 2016 usan Pyside y QT4; Maya 2017 utiliza Pyside2 y QT5. Más detalles aquí

Nota: las referencias más antiguas en la web se refieren al kit de herramientas de GUI Maya como "ELF"; Ese sigue siendo el nombre correcto, pero rara vez se usa.

Ejemplo de interfaz de usuario básica [Python]

El kit de herramientas de GUI de Maya crea una variedad de elementos de UI en una forma simple e imperativa. Hay comandos básicos para crear y editar widgets GUI; los widgets se identifican por un nombre de cadena único.

Todos los comandos gui adoptan la misma forma básica: usted proporciona un tipo de comando y el nombre de la cadena del objeto en el que desea trabajar o crear, junto con las banderas que especifican el aspecto o el comportamiento del widget. Entonces, por ejemplo, para crear un botón usarías:

 cmds.button('my_button', label = 'my label')

Esto creará un nuevo botón gui. Para editar el botón, se usaría el mismo comando con la edit (la versión corta es solo e ). Así que podrías cambiar la etiqueta del botón así:

cmds.button('my_button', e=True, label = 'a different label')

y puede consultar el valor actual de una propiedad con la query o el indicador q :

cmds.button(`my button`, q=True, label=True)
# 'a different label'

Nombramiento de widgets

Cuando crea un nuevo widget con un comando de UI, puede proporcionar el nombre que desea que obtenga el nuevo widget. Sin embargo, no está garantizado: Maya le dará al botón el nombre que solicitó; si le ha dado un carácter que no reconoce o si ya hay un widget con el mismo nombre, puede recuperar un nombre diferente. Siempre es una buena práctica capturar el nombre de un nuevo widget cuando se crea para evitar sorpresas:

 my_button = cmds.button('my_button') 
 cmds.button(my_button, e=True, label = "a new label")

Funciones de devolución de llamada

Muchos widgets incluyen eventos que pueden activar funciones de devolución de llamada cuando el usuario interactúa con el widget. Por ejemplo, cuando se presiona un botón, se marca una casilla de verificación o se selecciona un menú desplegable, puede activar una función.

El indicador exacto que se asocia con estos eventos depende del widget, pero una devolución de llamada típica se vería así:

 def callback_fn(_ignore):
     print "button pressed"

 button = cmds.button(label='press me', command = callback_fn)

Al presionar el botón se imprimirá "botón presionado" en la ventana del oyente. La mayoría de los widgets activan algunos argumentos cuando sus devoluciones de llamada se activan (el button por ejemplo, siempre incluye un valor booleano), por lo que deberá asegurarse de que el controlador de devolución de llamada tenga la firma correcta para ir con el widget que está usando. Es por eso que callback_fn() toma un argumento a pesar de que no lo necesita.

Asignación de devolución de llamada

Maya admite dos formas diferentes de adjuntar funciones de devolución de llamada:

   # this works, but is not a great idea
   cmds.button(label = 'string reference', command = 'string_name_of_function')
   # use this form whenever possible
   cmds.button(label = 'direct function reference', command = callback_fn)

En el primer ejemplo, la devolución de llamada se asigna mediante un valor de cadena. Maya encontrará la devolución de llamada en el ámbito global de Python, que generalmente es difícil de acceder cuando se escribe un código adecuadamente organizado. Las devoluciones de llamada de nombre de cadena también son más lentas de resolver. El segundo ejemplo pasa la función Python real a la devolución de llamada: se prefiere este formulario porque es más rápido y, si no ha proporcionado una función válida a la función de devolución de llamada, sabrá cuándo se creará la interfaz de usuario en lugar de cuándo los widgets de la interfaz de usuario se utilizan realmente.

Si desea pasar un valor de argumento a una función de devolución de llamada, puede usar un lambda , un cierre o un argumento functools.partial vincular a la devolución de llamada.

Usando partial :

 from functools import partial
 ....
 def callback_fn(myValue, _ignore):  # _ignore swallows the original button argument
     print myValue

 button = cmds.button(label='press me', command = partial(callback_fn, "fooo"))

Usando lambda :

 def callback_fn(myValue):
     print myValue

 button = cmds.button(label='press me', command = lambda _ignore: callback_fn("fooo"))
 # here the lambda needs to handle the button argument

Utilizando cierres

b = cmds.button(label = 'press me')
# by defining this function when `b` exists, we can use it later
# without storing it explicitly
def get_button_label(*_):
    print "label of button", b, " is ", cmds.button(b, q=True, l=True)
cmds.button(b, e=True, c=get_button_label)

Hay más información sobre los nombres de devolución de llamada de cadena frente a la función de devolución de llamada aquí.

Creando una ventana

# create a window with a button that closes the window when clicked
window = cmds.window(title='example window')       # create the window
layout = cmds.columnLayout(adjustableColumn=True)  # add a vertical layout

def close_window(*_):
    cmds.deleteUI(window)                          # deletes the window above

button = cmds.button(label= 'press to close", command = close_window)

# show the window
cmds.showWindow(window)

Lambdas y bucles

Lambdas es un atajo útil para conectar comportamientos a elementos GUI.

b = cmds.button("make a cube", command = lambda _: cmds.polyCube())

Sin embargo, debido a la forma en que Python captura variables dentro de lambdas, puede obtener resultados inesperados si vincula comandos utilizando lambdas dentro de un bucle. Por ejemplo, esto parece que debería producir botones que crean esferas de diferentes tamaños:

# warning: doesn't work like it looks!
for n in range(5):
    b = cmds.button("sphere size %i" % n, command = lambda _: cmds.polySphere(radius=n))

Los botones se etiquetarán correctamente pero todos usarán el mismo radio (4) porque las lambdas capturarán ese valor cuando se cierre el ciclo. TLDR: si está generando devoluciones de llamadas dentro de un bucle, use functools.partial u otro método para capturar valores: las lambdas no funcionan para esta aplicación. Vea aquí para más detalles



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow