Sie die Variable nicht vorbei gx
so SetPressed()
wird scheitern, wenn Sie es ausführen, wie geschrieben (es könnte sporadisch arbeiten, wenn Sie die gx = ...
Linie direkt in den Hörer Ausführung versucht, bevor das Ganze läuft - aber es wird unberechenbar sein). Sie müssen einen Wert in Ihrer SetPressed()
-Funktion angeben, damit die set-Operation etwas zu arbeiten hat.
Nebenbei, die Verwendung von String-Namen zum Aufrufen Ihrer Schaltflächenfunktionen ist kein guter Weg zu gehen - Sie Code funktioniert, wenn vom Listener ausgeführt wird aber nicht funktioniert, wenn in einer Funktion gebündelt: Wenn Sie eine Zeichenfolge verwenden Name für die Funktionen Maya wird sie nur finden, wenn sie den globalen Namespace leben - das ist der Punkt, an dem die Listener Befehle absetzen, aber von anderen Funktionen aus nur schwer zu erreichen sind.
Hier ist ein minimales Beispiel dafür, wie dies zu tun, indem alle Funktionen und Variablen in einer anderen Funktion zu halten:
import maya.cmds as cmds
import pymel.core as pm
def example_window():
# make the UI
with pm.window(title = 'example') as w:
with pm.rowLayout(nc =3) as cs:
field = pm.floatFieldGrp(label = 'value', nf=3)
get_button = pm.button('get')
set_button = pm.button('set')
# define these after the UI is made, so they inherit the names
# of the UI elements
def get_command(_):
sel = pm.ls(sl=True)
if not sel:
cmds.warning("nothing selected")
return
value = sel[0].t.get() + [0]
pm.floatFieldGrp(field, e=True, v1= value[0], v2 = value[1], v3 = value[2])
def set_command(_):
sel = pm.ls(sl=True)
if not sel:
cmds.warning("nothing selected")
return
value = pm.floatFieldGrp(field, q=True, v=True)
sel[0].t.set(value[:3])
# edit the existing UI to attech the commands. They'll remember the UI pieces they
# are connected to
pm.button(get_button, e=True, command = get_command)
pm.button(set_button, e=True, command = set_command)
w.show()
#open the window
example_window()
Im Allgemeinen ist es diese Art der Sache, die die kniffligsten Bit dabei Maya GUI ist - - Sie müssen sicherstellen, dass alle Funktionen und Handler usw. sich gegenseitig sehen und Informationen austauschen können. In diesem Beispiel teilt die Funktion die Informationen mit, indem sie die Handler definiert, nachdem die Benutzeroberfläche vorhanden ist, damit sie die Namen der UI-Elemente erben und wissen können, woran sie arbeiten sollen. Es gibt andere Möglichkeiten, dies zu tun (Klassen sind die anspruchsvollsten und komplexesten), aber dies ist der minimalistische Weg, dies zu tun. Es gibt einen tieferen Tauchgang auf, wie man das tut here
Können Sie klarer sein, wonach Sie fragen? Versuchen Sie, ein Attribut für mehrere Objekte zu erhalten und festzulegen? –