Maya Python: 名称未使用 floatSliderGrp 定义
Maya Python: name not defined with floatSliderGrp
我正在尝试设置比例滑块,每当我更改滑块值时,我都希望打印出新值:
scaleSlider = cmds.floatSliderGrp(label='Curve Scale',
field=True,
minValue=0.0,
maxValue=2.0,
fieldMinValue=0.0,
fieldMaxValue=2.0,
value=1,
cc="print cmds.floatSliderGrp(scaleSlider, q=True, v=True)" )
这看起来很简单,但我收到了这个错误:
// Error: name 'scaleSlider' is not defined
# Traceback (most recent call last):
# File "<maya console>", line 1, in <module>
# NameError: name 'scaleSlider' is not defined //
不幸的是,该错误描述性不强。我无法确定可能是什么问题。起初我以为它是自指的,但错误会告诉我如果是这样,对吗?
使用 dict 和 lambda,
def get_ui_value(ui_id, ui_type):
mcds = globals()["cmds"]
method = getattr(mcds, ui_type)
print method(ui_id, q=True, v=True)
ui_dict = {}
ui_dict["flt_slider_xy"] = cmds.floatSliderGrp(label='Curve Scale',
field=True,
minValue=0.0,
maxValue=2.0,
fieldMinValue=0.0,
fieldMaxValue=2.0,
value=1)
ui_dict["int_slider_xy"] = cmds.intSliderGrp(label='Curve Scale',
field=True,
minValue=0,
maxValue=10,
fieldMinValue=0,
fieldMaxValue=2,
value=1)
cmds.floatSliderGrp(ui_dict["flt_slider_xy"], e=True, cc= (lambda message:get_ui_value(ui_dict[flt_slider_xy], "floatSliderGrp")))
cmds.floatSliderGrp(ui_dict["int_slider_xy"], e=True, cc= (lambda message:get_ui_value(ui_dict[int_slider_xy], "intSliderGrp")))
您的问题出在 cc
参数中。
首先,您传递的是 语句 而不是函数:您需要将整个内容包装在 def 或 lambda 中才能正常工作。其次,您向它传递了一个对 scaleSlider
的字符串引用,但在定义回调时该变量不存在。在某些情况下,此代码 会 工作,而在其他情况下则不会(例如,在函数内部,它会失败)。使用字符串回调参数是对这类问题的邀请。
这样更容易:
w = cmds.window()
c = cmds.columnLayout()
s = cmds.floatSliderGrp("example")
def callback(*_):
print s, "=", cmds.floatSliderGrp(s, q=True, v=True)
cmds.floatSliderGrp(s, e=True, cc=callback)
cmds.showWindow(w)
因为 callback
是在 cmds.floatSliderGrp("example")
执行后定义的,它知道 s
的值(不要在实际代码中使用单字母变量!)。因为 cmds.floatSliderGrp(s, e=True, cc=callback)
在那之后执行,所以它将知道 s
正确值的回调版本传递给这个特定的浮动滑块组。此示例将在侦听器中工作或包装在函数中,因为范围是一致的。
@AriGold 的解决方案也可以工作,尽管 lambdas
不能在循环中使用——如果你试图在循环中 运行 他的解决方案,所有回调可能最终指向在最后一个 UI 元素,因为 lambda 的绑定很晚。
关于设置 UI 回调的不同方法的更多详细信息 here
我正在尝试设置比例滑块,每当我更改滑块值时,我都希望打印出新值:
scaleSlider = cmds.floatSliderGrp(label='Curve Scale',
field=True,
minValue=0.0,
maxValue=2.0,
fieldMinValue=0.0,
fieldMaxValue=2.0,
value=1,
cc="print cmds.floatSliderGrp(scaleSlider, q=True, v=True)" )
这看起来很简单,但我收到了这个错误:
// Error: name 'scaleSlider' is not defined
# Traceback (most recent call last):
# File "<maya console>", line 1, in <module>
# NameError: name 'scaleSlider' is not defined //
不幸的是,该错误描述性不强。我无法确定可能是什么问题。起初我以为它是自指的,但错误会告诉我如果是这样,对吗?
使用 dict 和 lambda,
def get_ui_value(ui_id, ui_type):
mcds = globals()["cmds"]
method = getattr(mcds, ui_type)
print method(ui_id, q=True, v=True)
ui_dict = {}
ui_dict["flt_slider_xy"] = cmds.floatSliderGrp(label='Curve Scale',
field=True,
minValue=0.0,
maxValue=2.0,
fieldMinValue=0.0,
fieldMaxValue=2.0,
value=1)
ui_dict["int_slider_xy"] = cmds.intSliderGrp(label='Curve Scale',
field=True,
minValue=0,
maxValue=10,
fieldMinValue=0,
fieldMaxValue=2,
value=1)
cmds.floatSliderGrp(ui_dict["flt_slider_xy"], e=True, cc= (lambda message:get_ui_value(ui_dict[flt_slider_xy], "floatSliderGrp")))
cmds.floatSliderGrp(ui_dict["int_slider_xy"], e=True, cc= (lambda message:get_ui_value(ui_dict[int_slider_xy], "intSliderGrp")))
您的问题出在 cc
参数中。
首先,您传递的是 语句 而不是函数:您需要将整个内容包装在 def 或 lambda 中才能正常工作。其次,您向它传递了一个对 scaleSlider
的字符串引用,但在定义回调时该变量不存在。在某些情况下,此代码 会 工作,而在其他情况下则不会(例如,在函数内部,它会失败)。使用字符串回调参数是对这类问题的邀请。
这样更容易:
w = cmds.window()
c = cmds.columnLayout()
s = cmds.floatSliderGrp("example")
def callback(*_):
print s, "=", cmds.floatSliderGrp(s, q=True, v=True)
cmds.floatSliderGrp(s, e=True, cc=callback)
cmds.showWindow(w)
因为 callback
是在 cmds.floatSliderGrp("example")
执行后定义的,它知道 s
的值(不要在实际代码中使用单字母变量!)。因为 cmds.floatSliderGrp(s, e=True, cc=callback)
在那之后执行,所以它将知道 s
正确值的回调版本传递给这个特定的浮动滑块组。此示例将在侦听器中工作或包装在函数中,因为范围是一致的。
@AriGold 的解决方案也可以工作,尽管 lambdas
不能在循环中使用——如果你试图在循环中 运行 他的解决方案,所有回调可能最终指向在最后一个 UI 元素,因为 lambda 的绑定很晚。
关于设置 UI 回调的不同方法的更多详细信息 here