使用python脚本在maya中创建UI

时间:2010-08-08 16:37:39

标签: python maya

我正在使用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。在这种情况下,我试图创建一个文本字段按钮,用户键入一组坐标,并根据给定的坐标集创建基于定位器的曲线。但是,我只能创建一个创建默认曲线的按钮。有人可以告诉我如何创建一个按钮,考虑人的坐标和输出特定曲线?

2 个答案:

答案 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声明,我得到了你的定位器曲线就好了。