Recherche…


Paramètres

paramètre détails
e / modifier indique à Maya que vous souhaitez modifier la valeur d'une propriété existante
q / query dit à Maya que vous voulez obtenir la valeur d'une propriété existante

Remarques

Maya est livré avec une boîte à outils d'interface utilisateur assez complète qui comprend des fenêtres, des dispositions et une variété de contrôles. Ceci est implémenté en utilisant le framework QT en C ++, mais exposé aux utilisateurs MEL et Python via le jeu de commandes Maya par défaut.

QT

Les utilisateurs avancés peuvent étendre l'interface utilisateur Maya en utilisant C ++ ou Python. Les versions Maya de 2012 à 2016 utilisent Pyside et QT4; Maya 2017 utilise Pyside2 et QT5. Plus de détails ici

Remarque: la référence antérieure sur le Web fait référence à la boîte à outils graphique de Maya en tant que "ELF"; c'est toujours le nom correct mais c'est rarement utilisé.

Exemple de base de l'interface utilisateur [Python]

Le toolkit GUI de Maya crée une variété d'éléments d'interface utilisateur sous une forme simple et impérative. Il existe des commandes de base pour créer et éditer des widgets GUI; les widgets sont identifiés par un nom de chaîne unique.

Toutes les commandes de l'interface graphique prennent la même forme de base: vous fournissez un type de commande et le nom de la chaîne de l'objet sur lequel vous souhaitez travailler ou créer, ainsi que des indicateurs spécifiant l'apparence ou le comportement du widget. Par exemple, pour créer un bouton, vous utiliseriez:

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

Cela créera un nouveau bouton d'interface graphique. Pour éditer le bouton, vous utiliseriez la même commande avec le drapeau d' edit (la version courte est juste e ). Donc, vous pouvez changer l’étiquette du bouton comme ceci:

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

et vous pouvez interroger la valeur actuelle d'une propriété avec la query ou l'indicateur q :

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

Nom du widget

Lorsque vous créez un nouveau widget avec une commande d'interface utilisateur, vous pouvez fournir le nom souhaité pour le nouveau widget. Cependant, ce n'est pas garanti: Maya donnera au bouton le nom que vous avez demandé - si vous lui avez donné un caractère qu'il ne reconnaît pas ou s'il existe déjà un widget avec le même nom, vous pouvez obtenir un nom différent. Il est toujours recommandé de saisir le nom d'un nouveau widget lorsqu'il est créé pour éviter les surprises:

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

Fonctions de rappel

De nombreux widgets incluent des événements pouvant déclencher des fonctions de rappel lorsque l'utilisateur interagit avec le widget. Par exemple, lorsqu'un bouton est pressé, une case à cocher cochée ou une liste déroulante choisie, vous pouvez déclencher une fonction.

L'indicateur exact associé à ces événements dépend du widget, mais un rappel typique ressemblerait à ceci:

 def callback_fn(_ignore):
     print "button pressed"

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

En appuyant sur le bouton, vous imprimez "bouton enfoncé" dans la fenêtre de l'auditeur. La plupart des widgets génèrent des arguments lorsque leurs rappels sont activés - le button par exemple inclut toujours une valeur booléenne - vous devez donc vous assurer que le gestionnaire de rappel a la bonne signature pour aller avec le widget que vous utilisez. C'est pourquoi callback_fn() prend un argument même s'il n'en a pas besoin.

Affectation de rappel

Maya prend en charge deux manières différentes de joindre des fonctions de rappel:

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

Dans le premier exemple, le rappel est attribué par une valeur de chaîne. Maya trouvera le rappel dans la portée globale de Python - qui est généralement difficile à accéder lors de l'écriture d'un code correctement organisé. Les rappels de nom de chaîne sont également plus lents à résoudre. Le second exemple transmet la fonction Python réelle au rappel - cette forme est préférable car elle est plus rapide et, si vous n'avez pas réussi à fournir une fonction valide à la fonction de rappel, vous saurez quand l'interface utilisateur est créée au lieu de quand les widgets d'interface utilisateur sont effectivement utilisés.

Si vous voulez transmettre une valeur d'argument à une fonction de rappel, vous pouvez utiliser un argument lambda , une fermeture ou une liaison functools.partial au rappel.

En utilisant 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"))

En utilisant 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

Utiliser des fermetures

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)

Il y a plus sur les noms de rappel de chaîne par rapport à la fonction de rappel ici

Créer une fenêtre

# 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 et boucles

Les Lambdas sont un raccourci utile pour connecter les comportements aux éléments de l'interface graphique.

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

Cependant, en raison de la façon dont Python capture les variables à l'intérieur de lambdas, vous pouvez obtenir des résultats inattendus si vous liez des commandes à l'aide de lambdas dans une boucle. Par exemple, il semble que cela devrait produire des boutons qui créent des sphères de tailles différentes:

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

Les boutons seront étiquetés correctement mais utiliseront tous le même rayon (4) car les lambda captureront tous cette valeur à la fermeture de la boucle. TLDR: Si vous générez des rappels à l'intérieur d'une boucle, utilisez functools.partial ou une autre méthode pour capturer les valeurs - lambdas ne fonctionne pas pour cette application. Voir ici pour plus de détails



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow