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