Szukaj…


Parametry

parametr Detale
e / edycja informuje Mayę, że chcesz zmienić wartość istniejącej nieruchomości
q / zapytanie informuje Mayę, że chcesz uzyskać wartość istniejącej nieruchomości

Uwagi

Maya jest dostarczana z dość kompletnym zestawem narzędzi interfejsu użytkownika, który obejmuje okna, układy i różne elementy sterujące. Jest to implementowane przy użyciu frameworka QT w C ++, ale udostępniane użytkownikom MEL i Python za pomocą domyślnego zestawu komend Maya.

QT

Zaawansowani użytkownicy mogą rozszerzyć interfejs Maya za pomocą C ++ lub Python. Wersje Maya od 2012 do 2016 używają Pyside i QT4; Maya 2017 używa Pyside2 i QT5. Więcej informacji tutaj

Uwaga: starsze odwołania w sieci odnoszą się do zestawu narzędzi interfejsu GUI Maya jako „ELF”; to wciąż poprawna nazwa, ale jest rzadko używana.

Przykład podstawowego interfejsu użytkownika [Python]

Zestaw narzędzi Maya GUI tworzy różnorodne elementy interfejsu użytkownika w prostej, bezwzględnej formie. Istnieją podstawowe polecenia do tworzenia i edycji widżetów GUI; widżety są identyfikowane unikalną nazwą ciągu.

Wszystkie polecenia GUI mają tę samą podstawową formę: podajesz typ polecenia i nazwę ciągu obiektu, nad którym chcesz pracować lub utworzyć, wraz z flagami określającymi wygląd lub zachowanie widgetu. Na przykład, aby utworzyć przycisk, którego użyjesz:

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

Spowoduje to utworzenie nowego przycisku GUI. Aby edytować przycisk, użyj tego samego polecenia z flagą edit (krótka wersja to tylko e ). Aby zmienić etykietę przycisku w następujący sposób:

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

i możesz zapytać o bieżącą wartość właściwości za pomocą query lub flagi q :

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

Nazewnictwo widżetów

Podczas tworzenia nowego widżetu za pomocą polecenia interfejsu użytkownika możesz podać nazwę, którą ma otrzymać nowy widżet. Jednak nie jest to gwarantowane: Maya nada przyciskowi nazwę, o którą prosiłeś - jeśli nadasz mu znak, którego nie rozpoznaje lub jeśli istnieje już widżet o tej samej nazwie, możesz otrzymać inną nazwę. Zawsze dobrą praktyką jest przechwytywanie nazwy nowego widżetu podczas jego tworzenia, aby uniknąć niespodzianek:

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

Funkcje oddzwaniania

Wiele widżetów obejmuje zdarzenia, które mogą wywoływać funkcje oddzwaniania, gdy użytkownik wchodzi w interakcję z widżetem. Na przykład po naciśnięciu przycisku, zaznaczeniu pola wyboru lub wybraniu menu rozwijanego można uruchomić funkcję.

Dokładna flaga powiązana z tym zdarzeniem zależy od widżetu, ale typowe wywołanie zwrotne wyglądałoby tak:

 def callback_fn(_ignore):
     print "button pressed"

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

Naciśnięcie przycisku spowoduje wydrukowanie „naciśniętego przycisku” w oknie słuchacza. Większość widgetów wysyła niektóre argumenty, gdy aktywują się ich wywołania zwrotne - na przykład button zawsze zawiera wartość logiczną - więc musisz upewnić się, że moduł obsługi wywołania zwrotnego ma odpowiednią sygnaturę, aby pasował do używanego widżetu. Dlatego callback_fn() pobiera argument, nawet jeśli go nie potrzebuje.

Przypisanie oddzwaniania

Maya obsługuje dwa różne sposoby dołączania funkcji oddzwaniania:

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

W pierwszym przykładzie wywołanie zwrotne jest przypisywane przez wartość ciągu. Maya znajdzie wywołanie zwrotne w globalnym zakresie Python - do którego zwykle trudno jest uzyskać dostęp, pisząc odpowiednio zorganizowany kod. Wywołania zwrotne nazw łańcuchowych są również wolniejsze do rozwiązania. Drugi przykład przekazuje rzeczywistą funkcję Pythona do wywołania zwrotnego - ta forma jest preferowana, ponieważ jest szybsza, a jeśli nie dostarczysz prawidłowej funkcji do funkcji wywołania zwrotnego, będziesz wiedzieć, kiedy tworzony jest interfejs użytkownika, a nie kiedy Widżety interfejsu użytkownika są faktycznie używane.

Jeśli chcesz przekazać wartość argumentu do funkcji zwrotnej, możesz użyć argumentów lambda , zamknięcia lub funools.partial powiązania z wywołaniem zwrotnym.

Przy użyciu 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"))

Za pomocą 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

Korzystanie z zamknięć

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)

Więcej informacji na temat ciągów nazw wywołań zwrotnych vs. funkcji wywołania zwrotnego tutaj

Tworzenie okna

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

Lambdy i pętle

Lambda to przydatny skrót do łączenia zachowań z elementami GUI.

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

Jednak ze względu na sposób, w jaki Python przechwytuje zmienne wewnątrz lambdas, możesz uzyskać nieoczekiwane wyniki, jeśli powiążesz polecenia przy użyciu lambdas wewnątrz pętli. Na przykład wygląda na to, że powinien tworzyć przyciski, które tworzą kule o różnych rozmiarach:

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

Przyciski zostaną poprawnie oznaczone, ale wszystkie będą miały ten sam promień (4), ponieważ wszystkie lambda przechwycą tę wartość po zamknięciu pętli. TLDR: Jeśli generujesz wywołania zwrotne w pętli, użyj funkcji functools.partial lub innej metody do przechwytywania wartości - lambda nie działają dla tej aplikacji. Zobacz tutaj po więcej szczegółów



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow