maya
Maya-Benutzeroberfläche erstellen
Suche…
Parameter
| Parameter | Einzelheiten |
|---|---|
| e / edit | teilt Maya mit, dass Sie den Wert einer vorhandenen Eigenschaft ändern möchten |
| q / Abfrage | sagt Maya, dass Sie den Wert einer vorhandenen Eigenschaft erhalten möchten |
Bemerkungen
Maya enthält ein ziemlich komplettes UI-Toolkit, das Fenster, Layouts und verschiedene Steuerelemente umfasst. Dies wird mithilfe des QT- Frameworks in C ++ implementiert, ist jedoch für MEL- und Python-Benutzer über den Maya-Standardbefehlssatz verfügbar.
QT
Fortgeschrittene Benutzer können die Maya-Benutzeroberfläche entweder mit C ++ oder Python erweitern. Maya-Versionen von 2012 bis 2016 verwenden Pyside und QT4; Maya 2017 verwendet Pyside2 und QT5. Weitere Details hier
Hinweis: Ältere Verweise im Internet beziehen sich auf das Maya-GUI-Toolkit als "ELF". Das ist immer noch der richtige Name, wird aber selten verwendet.
Grundlegendes UI-Beispiel [Python]
Das Maya-GUI-Toolkit erstellt verschiedene UI-Elemente in einer einfachen, imperativen Form. Es gibt grundlegende Befehle zum Erstellen und Bearbeiten von GUI-Widgets. Die Widgets werden durch einen eindeutigen Stringnamen identifiziert.
Alle GUI-Befehle haben dieselbe Grundform: Sie geben einen Befehlstyp und den Zeichenfolgennamen des Objekts an, an dem Sie arbeiten oder das Sie erstellen möchten, sowie Flags, die das Aussehen oder Verhalten des Widgets angeben. So erstellen Sie beispielsweise eine Schaltfläche, die Sie verwenden würden:
cmds.button('my_button', label = 'my label')
Dadurch wird eine neue GUI-Schaltfläche erstellt. Um die Schaltfläche zu bearbeiten, verwenden Sie denselben Befehl mit der edit (die Kurzversion ist nur e ). So können Sie die Beschriftung der Schaltfläche folgendermaßen ändern:
cmds.button('my_button', e=True, label = 'a different label')
Sie können den aktuellen Wert einer Eigenschaft mit der query oder dem Flag q query :
cmds.button(`my button`, q=True, label=True)
# 'a different label'
Widget-Benennung
Wenn Sie ein neues Widget mit einem UI-Befehl erstellen, können Sie den Namen angeben, den das neue Widget erhalten soll. Es ist jedoch nicht garantiert: Maya gibt dem Button den Namen, nach dem Sie gefragt haben - wenn Sie ihm einen Charakter gegeben haben, den er nicht erkennt, oder wenn bereits ein Widget mit demselben Namen vorhanden ist, erhalten Sie möglicherweise einen anderen Namen. Es empfiehlt sich immer , den Namen eines neuen Widgets bei der Erstellung zu erfassen, um Überraschungen zu vermeiden:
my_button = cmds.button('my_button')
cmds.button(my_button, e=True, label = "a new label")
Rückruffunktionen
Viele Widgets enthalten Ereignisse, die Callback-Funktionen auslösen können, wenn der Benutzer mit dem Widget interagiert. Wenn Sie beispielsweise eine Taste drücken, ein Kontrollkästchen aktivieren oder eine Dropdown-Liste auswählen, können Sie eine Funktion auslösen.
Das genaue Flag, das diesen Ereignissen zugeordnet ist, hängt vom Widget ab. Ein typischer Rückruf würde jedoch folgendermaßen aussehen:
def callback_fn(_ignore):
print "button pressed"
button = cmds.button(label='press me', command = callback_fn)
Durch Drücken der Taste wird "Taste gedrückt" in das Listener-Fenster gedruckt. Bei den meisten Widgets werden einige Argumente ausgelöst, wenn ihre Rückrufe aktiviert werden - die button zum Beispiel enthält immer einen booleschen Wert. Sie müssen also sicherstellen, dass der Rückruf-Handler über die richtige Signatur für das verwendete Widget verfügt. Deshalb nimmt callback_fn() ein Argument an, obwohl es es nicht benötigt.
Rückrufzuweisung
Maya unterstützt zwei verschiedene Arten, Callback-Funktionen hinzuzufügen:
# 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)
Im ersten Beispiel wird der Callback durch einen Stringwert zugewiesen. Maya findet den Rückruf im globalen Python-Bereich, auf den normalerweise nur schwer zugegriffen werden kann, wenn ordnungsgemäß organisierter Code geschrieben wird. Rückrufe mit Zeichenfolgennamen lassen sich auch langsamer auflösen. Das zweite Beispiel übergibt die eigentliche Python-Funktion an den Rückruf. Diese Form wird bevorzugt, da sie schneller ist. Wenn Sie der Callback-Funktion keine gültige Funktion zur Verfügung stellen können, wissen Sie, wann die Benutzeroberfläche erstellt wird, und nicht wann Die UI-Widgets werden tatsächlich verwendet.
Wenn Sie einen Argumentwert an eine Rückruffunktion übergeben möchten , können Sie ein Lambda , eine Schließung oder ein functools.partial- Bindungsargument für den Rückruf verwenden.
Mit 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"))
Mit 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
Verschlüsse verwenden
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)
Weitere Informationen zu String-Callback-Namen und zur Callback-Funktion finden Sie hier
Fenster erstellen
# 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 und Schleifen
Lambdas sind eine nützliche Verknüpfung, um Verhalten mit GUI-Elementen zu verknüpfen.
b = cmds.button("make a cube", command = lambda _: cmds.polyCube())
Aufgrund der Art und Weise, wie Python Variablen innerhalb von Lambdas erfasst, können Sie jedoch unerwartete Ergebnisse erhalten, wenn Sie Befehle mit Lambdas in einer Schleife binden. Zum Beispiel sieht das so aus, als müsste er Knöpfe erzeugen, die Kugeln unterschiedlicher Größe erzeugen:
# 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))
Die Schaltflächen werden korrekt beschriftet, verwenden jedoch alle denselben Radius (4), da alle Lambdas diesen Wert erfassen, wenn die Schleife geschlossen wird. TLDR: Wenn Sie Callbacks innerhalb einer Schleife functools.partial , verwenden Sie functools.partial oder eine andere Methode zum Erfassen von Werten. Lambdas funktionieren für diese Anwendung nicht. Sehen Sie hier , um weitere Informationen