您没有传递变量gx
,因此SetPressed()
如果按书面方式运行它会失败(如果您尝试gx = ...
在运行整个过程之前直接在侦听器中执行该行,它可能会偶尔工作 - 但它会不稳定)。您需要在SetPressed()
函数中提供一个值,以便设置操作可以使用。
顺便说一句,使用字符串名称来调用您的按钮函数不是一个好方法——您的代码在从侦听器执行时可以工作,但如果捆绑到函数中则不会工作:当您为函数使用字符串名称时如果它们位于全局命名空间中,Maya 只会找到它们——这是您的侦听器命令所在的位置,但很难从其他函数中访问它们。
这是一个最小的示例,说明如何通过将所有函数和变量保留在另一个函数中来做到这一点:
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()
一般来说,这是做 Maya GUI 中最棘手的事情——你需要确保所有的函数和处理程序等可以互相看到并且可以共享信息。在此示例中,该函数通过在 UI 存在后定义处理程序来共享信息,因此它们可以继承 UI 部分的名称并知道要处理的内容。还有其他方法可以做到这一点(类是最复杂和最复杂的),但这是最简单的方法。这里有更深入的了解如何做到这一点