我正在使用python在maya中创建一个自定义UI,我在这一行上发生了这个错误:
parts = button2.split(",") # NameError: global name 'button2' is not defined
这是我的剧本:
import maya.cmds as cmds
def createMyLayout():
window = cmds.window(widthHeight=(1000, 600), title="lalala", resizeToFitChildren=1)
cmds.rowLayout("button1, button2, button3", numberOfColumns=5)
cmds.columnLayout(adjustableColumn=True, columnAlign="center", rowSpacing=10)
button2 = cmds.textFieldButtonGrp(label="LocatorCurve",
text="Please key in your coordinates",
changeCommand=edit_curve,
buttonLabel="Execute",
buttonCommand=locator_curve)
cmds.setParent(menu=True)
cmds.showWindow(window)
def locator_curve(*args):
# Coordinates of the locator-shaped curve.
crv = cmds.curve(degree=1,
point=[(1, 0, 0),
(-1, 0, 0),
(0, 0, 0),
(0, 1, 0),
(0, -1, 0),
(0, 0, 0),
(0, 0, 1),
(0, 0, -1),
(0, 0, 0)])
return crv
def edit_curve(*args):
parts = button2.split(",")
print parts
createMyLayout()
基本上我的脚本试图创建一个内部有按钮的UI。在这种情况下,我试图创建一个文本字段按钮,用户键入一组坐标,并根据给定的坐标集创建基于定位器的曲线。但是,我只能创建一个创建默认曲线的按钮。有人可以告诉我如何创建一个按钮,考虑人的坐标和输出特定曲线?
答案 0 :(得分:3)
您可以使用全局变量,但更优雅的方法是实现类。
以下是如何使用类修复此问题的示例。请注意我们如何使用self.button2
而不仅仅是button2
。这使它成为类的实例变量,并可在其他函数中访问,而button2
是局部变量,当您离开函数时不再可访问它。
import maya.cmds as cmds
class createMyLayoutCls(object):
def __init__(self, *args):
pass
def show(self):
self.createMyLayout()
def createMyLayout(self):
self.window = cmds.window(widthHeight=(1000, 600), title="lalala", resizeToFitChildren=1)
cmds.rowLayout("button1, button2, button3", numberOfColumns=5)
cmds.columnLayout(adjustableColumn=True, columnAlign="center", rowSpacing=10)
self.button2 = cmds.textFieldButtonGrp(label="LocatorCurve",
text="Please key in your coordinates",
changeCommand=self.edit_curve,
buttonLabel="Execute",
buttonCommand=self.locator_curve)
cmds.setParent(menu=True)
cmds.showWindow(self.window)
def locator_curve(self,*args):
# Coordinates of the locator-shaped curve.
crv = cmds.curve(degree=1,
point=[(1, 0, 0),
(-1, 0, 0),
(0, 0, 0),
(0, 1, 0),
(0, -1, 0),
(0, 0, 0),
(0, 0, 1),
(0, 0, -1),
(0, 0, 0)])
return crv
def edit_curve(self,*args):
parts = self.button2.split(",")
print parts
txt_val = cmds.textFieldButtonGrp(self.button2, q=True,text=True)
print txt_val
b_cls = createMyLayoutCls()
b_cls.show()
我知道回复太晚了,你现在肯定会成为python的高手;)
希望它能帮助其他人:)
答案 1 :(得分:0)
要在函数之间共享变量,例如“button2”,您需要将其声明为“全局”。现在,这两个函数分别创建了button2变量,它们无法看到彼此。
首先,在函数外部的全局范围内声明变量。然后在你想要使用它的任何函数中再次声明它,然后你可以像普通变量一样使用它。
global myVar
myVar = 1
def test1():
global myVar
print myVar
myVar += 1
def test2():
global myVar
print myVar
myVar += 1
print myVar
test1()
test2()
# output:
# 1
# 2
# 3
至于格式化条目字符串,看起来你是在正确的轨道上 - 我只是全局声明了button2,然后在每个函数中添加了全局button2声明,我得到了你的定位器曲线就好了。