Python 连续创建多个实例时使用正确的类实例

Python 连续创建多个实例时使用正确的类实例,python,button,instance,maya,Python,Button,Instance,Maya,当我在一行中创建多个选项卡时,脚本出现问题。如果我制作了两个选项卡,然后尝试编辑第一个选项卡,我会很高兴;它会更改第二个选项卡,而不是第一个选项卡 import pymel.core as pm import maya.cmds as cmds class TabWindow(pm.ui.Window): def __init__(self): super(TabWindow, self).__init__() self.title = "TabW

当我在一行中创建多个选项卡时,脚本出现问题。如果我制作了两个选项卡,然后尝试编辑第一个选项卡,我会很高兴;它会更改第二个选项卡,而不是第一个选项卡

import pymel.core as pm
import maya.cmds as cmds
class TabWindow(pm.ui.Window):    
    def __init__(self):
        super(TabWindow, self).__init__()
        self.title = "TabWindow"
        self.tabA = None
        self.tabB = None                      
        self.buildUI()


    def modifySomethingInTabB(self):
        pm.button(label="TestButton", parent=self.tabB)

    def appendJointChain(self, *args):
        print "button pressed"
        self.set_up_Tab()
        self.tool_Tab()



    def fillTabA(self, parent):
        pm.setParent(parent)
        pm.text(label = 'Root Joint Selection', align ='center')
        pm.separator(h=5)
        pm.button(label = 'Add Selector', c=lambda event: self.name_DialogBox())

    def fillTabB(self, parent):    
        pm.setParent(parent)
        pm.text(label = 'FK IK Switch', align ='center')
        pm.separator(h=5)

    def Remove(InstanceName):
        pm.deleteUI(self)


    def buildUI(self):
        tabLayout = None
        children = []
        pm.setUITemplate("DefaultTemplate", pushTemplate=True)
        with pm.columnLayout(adjustableColumn=True,width=300) as cl:
            with pm.tabLayout() as tabLayout:
                for childName in ["My Tab A", "My Tab B"]:
                    with pm.columnLayout(adjustableColumn=True) as cla:
                        children.append((cla, childName))

        self.fillTabA(children[0][0])
        self.fillTabB(children[1][0])
        self.tabA = children[0][0]
        self.tabB = children[1][0]

        pm.tabLayout(tabLayout, edit=True, tabLabel=children)
        pm.setUITemplate("DefaultTemplate", popTemplate=True)      

    def name_DialogBox(self):
        result = cmds.promptDialog(
            title='Rename Object',
            message='Enter Name:',
            button=['OK', 'Cancel'],
            defaultButton='OK',
            cancelButton='Cancel',
            dismissString='Cancel')

        if result == 'OK':
            self.InstanceName = cmds.promptDialog(query=True, text=True)
            ###Create New Tab using text as name####
            self.appendJointChain()
            return self.InstanceName



    def set_up_Tab(self):

        cmds.frameLayout (width = 300, label = self.InstanceName,  collapse = True, collapsable = True, marginWidth = 5, parent = self.tabA);

        self.nametab =cmds.text(label = self.InstanceName, align ='center')

        self.tsL0 =pm.textFieldButtonGrp(ed=False, adj=1,cal=(1,"left"),cw3=(10,100,25), cl3=("left","left","left") , 
                                    buttonLabel='Root   FK', bc= lambda : self.select_joints_afk())
        self.tsL1 = pm.textFieldButtonGrp(ed=False, adj=1,cal=(1,"left"),cw3=(10,100,25), cl3=("left","left","left") , 
                                    buttonLabel='Wrist   IK',bc= lambda : self.select_joints_aikw())
        self.tsL2 = pm.textFieldButtonGrp(ed=False, adj=1,cal=(1,"left"),cw3=(10,100,25), cl3=("left","left","left") , 
                                    buttonLabel='Elbow IK',bc= lambda : self.select_joints_ikpv())

        pm.separator(h=5)
        pm.button( label = 'Remove ' + self.InstanceName, command = lambda :Remove(), width=100)
        pm.separator

        return self.tsL0, self.tsL1, self.tsL2



    def tool_Tab(self):

        cmds.frameLayout (width = 300, label = self.InstanceName,  collapse = True, collapsable = True, marginWidth = 5, parent = self.tabB);
        cmds.separator(h=5)
        self.row=cmds.rowLayout(numberOfColumns=2,width = 300)


        self.IKbutton=cmds.button(label='IK', command = '', width=100)
        self.FKbutton=cmds.button(label='FK', command = '', width=100)
        self.parent=cmds.setParent('..')
        self.row2=cmds.rowLayout(numberOfColumns=2,width = 300)

        self.Fk2IK_Button = pm.button(label='FK 2 IK', command = lambda _: self.fk_2_ik(), width=100)
        self.Ik2FK_Button = pm.button(label='IK 2 FK', command = lambda _: self.ik_2_fk(), width=100)

        self.parent

    def select_joints_afk(self):
        if cmds.ls(selection = True,type=("transform",'nurbsCurve')):
            sel = cmds.ls(sl=True)
            fkCtrls = cmds.listRelatives(sel, allDescendents=True, type=("transform",'nurbsCurve'))
            self.Fks = [nurbsCurve for nurbsCurve in fkCtrls if nurbsCurve.startswith('FK') & nurbsCurve.endswith('_Ctrl')]
            cmds.textFieldButtonGrp(self.tsL0, edit = True, tx ='' .join(sel),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))
            self.Fks.extend(sel)
            print self.Fks
            return self.Fks,self.tsL0
        else:
            text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'], 
                                        defaultButton='Ok', dismissString='No' )


    def select_joints_aikw(self):
        if cmds.ls(selection = True,type=("transform",'nurbsCurve')):

            sel=cmds.ls(selection = True)
            ikwrist = sel
            self.Ikw = [nurbsCurve for nurbsCurve in ikwrist if nurbsCurve.startswith('IK') & nurbsCurve.endswith('Ctrl')]
            cmds.textFieldButtonGrp(self.tsL1, edit = True, tx ='' .join(ikwrist),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))
            cmds.select(ikwrist)
            print self.Ikw
            return self.Ikw
        else:
            text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'], defaultButton='Ok', 
                                        dismissString='No' )

    def select_joints_ikpv(self):
        if cmds.ls(selection = True,type=("transform",'nurbsCurve')):
            sel = cmds.ls(sl=True)
            ikPvsel = sel
            self.ikpv = [nurbsCurve for nurbsCurve in ikPvsel if nurbsCurve.endswith('Pv_Ctrl')]
            cmds.textFieldButtonGrp(self.tsL2, edit = True, tx ='' .join(ikPvsel),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))        
            cmds.select(ikPvsel)
            print self.ikpv
            return self.ikpv
        else:
            text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'], 
                                        defaultButton='Ok', dismissString='No' )

    def ik_2_fk(self):

        #import combined selection list
        match_selection = self.Fks + self.Ikw + self.ikpv
        print("List created" + str(match_selection))



    def fk_2_ik(self):
         #import combined selection list
        match_selection = self.Fks + self.Ikw + self.ikpv
        print("List created" + str(match_selection))

tw = TabWindow()
# if pm.window(tw, exists = True):
#     pm.deleteUI(tw)
tw.show()


我的印象是,为了实现这一点,我需要让每一组选择都成为一个类的实例,以便我可以编辑它们。考虑到这一点,我移动了

    def select_joints_afk(self):,    def select_joints_aikw(self):, &   def select_joints_ikpv(self):
像这样创建selectionChains类

class Create_Selection_Chains():

    def __init__(self, name ,Fks, Ikw, ikpv):
        self.name=name
        self.Fks = Fks
        self.Ikw = Ikw
        self.ikpv = ikpv
        print  Fks + Ikw + ikpv


    def select_joints_afk(self):
        if cmds.ls(selection = True,type=("transform",'nurbsCurve')):
            sel = cmds.ls(sl=True)
            fkCtrls = cmds.listRelatives(sel, allDescendents=True, type=("transform",'nurbsCurve'))
            self.Fks = [nurbsCurve for nurbsCurve in fkCtrls if nurbsCurve.startswith('FK') & nurbsCurve.endswith('_Ctrl')]
            cmds.textFieldButtonGrp(TabWindow().tsL0, edit = True, tx ='' .join(sel),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))
            self.Fks.extend(sel)
            print self.Fks
            return self.Fks 
        else:
            text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'], 
                                        defaultButton='Ok', dismissString='No' )

    def select_joints_aikw(self):
        if cmds.ls(selection = True,type=("transform",'nurbsCurve')):

            sel=cmds.ls(selection = True)
            ikwrist = sel
            self.Ikw = [nurbsCurve for nurbsCurve in ikwrist if nurbsCurve.startswith('IK') & nurbsCurve.endswith('Ctrl')]
            cmds.textFieldButtonGrp(Set_up_Tab().tsL1, edit = True, tx ='' .join(ikwrist),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))
            cmds.select(ikwrist)
            print self.Ikw
            return self.Ikw
        else:
            text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'], defaultButton='Ok', 
                                        dismissString='No' )

    def select_joints_ikpv(self):
        if cmds.ls(selection = True,type=("transform",'nurbsCurve')):
            sel = cmds.ls(sl=True)
            ikPvsel = sel
            self.ikpv = [nurbsCurve for nurbsCurve in ikPvsel if nurbsCurve.endswith('Pv_Ctrl')]
            cmds.textFieldButtonGrp(self.tsL2, edit = True, tx ='' .join(ikPvsel),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))        
            cmds.select(ikPvsel)
            print self.ikpv
            return self.ikpv
        else:
            text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'], 
                                        defaultButton='Ok', dismissString='No' )

&该实例是在TabWindow类方法def appendJointChainself,*args::

我已经在上面的Create_Selection_Chains类中对此做了几次尝试,但似乎都做不好


# Error: AttributeError: file <maya console> line 136: 'TabWindow' object has no attribute 'tsL0' #
# Error: NameError: file <maya console> line 150: global name 'Set_up_Tab' is not defined #
# Error: AttributeError: file <maya console> line 163: Create_Selection_Chains instance has no attribute 'tsL2' #

我想我可能需要让我在UI中创建的选项卡要么是他们自己的类,要么是create_Selection_Chains类的一部分,但我现在真的不确定。
有人能解释一下发生了什么以及我如何解决这个问题吗?

由于您的代码有点混乱,所以给您一些建议有点困难。由于您正在创建一个接口,并且无论如何都要使用pymel,因此我建议将所有内容都保存在一个类中,并在这个类中构建所有内容。e、 g.您想要创建一个包含两个选项卡的窗口,可以这样操作:

class TabWindow(pm.ui.Window):
    def __init__(self):
        super(TabWindow, self).__init__()
        self.title = "TabWindow"
        self.tabA = None
        self.tabB = None
        self.buildUI()

    def createSelecttionChain(self):
        pass

    def modifySomethingInTabB(self):
        pm.button(label="TestButton", parent=self.tabB)

    def pushButton(self, *args):
        print "button pressed"
        self.modifySomethingInTabB()

    def fillTabA(self, parent):
        pm.setParent(parent)
        pm.button(label="PushMe", c=self.pushButton)

    def buildUI(self):
        tabLayout = None
        children = []
        pm.setUITemplate("DefaultTemplate", pushTemplate=True)
        with pm.columnLayout(adjustableColumn=True) as cl:
            with pm.tabLayout() as tabLayout:
                for childName in ["My Tab A", "My Tab B"]:
                    with pm.columnLayout(adjustableColumn=True) as cla:
                        children.append((cla, childName))

        self.fillTabA(children[0][0])
        self.tabA = children[0][0]
        self.tabB = children[1][0]

        pm.tabLayout(tabLayout, edit=True, tabLabel=children)
        pm.setUITemplate("DefaultTemplate", popTemplate=True)      

tw = TabWindow()
tw.show()

然后,您可以逐步添加工具。这样,代码的可读性和维护性就更好了。错误更容易发现。

您应该提供一个可执行代码。 下面是一个管理ui的高级示例。 它基于您的代码和我从中了解的内容:

import maya.cmds as cmds
import re

global myUI
myUI = {}

# please use for def lower case for the first letter and upper case for class
def nameDialogBox(*args):
    print('prompt')

class TabSet(object):
    # don't put self here, they are implicit
    gtF0 = []
    gtF1 = []
    def __init__(self, parent=None):
        self.name = parent

    def addTab(self, name):
        nb = cmds.tabLayout(self.name, q=True, tabLabelIndex=True)
        index = len(nb) +  1

        myUI['tab{}'.format(index)] = cmds.columnLayout(p=self.name)

        cmds.tabLayout( self.name, q=True, tabLabel=True)

        cmds.tabLayout( self.name, edit=True, tabLabel=[myUI['tab{}'.format(index)], name])

        return myUI['tab{}'.format(index)]

    def listTabs(self):

        keys = [i for i in myUI.keys() if re.match('^tab\d+$', i)]
        keys = sorted(keys)
        output = [myUI[k] for k in keys]

        return output

def toolWidget(parent=str):
    wgt = cmds.rowColumnLayout(numberOfColumns=2, p=parent)
    cmds.button(l='WidgetButton1', p=wgt)
    cmds.button(l='WidgetButton2',p=wgt)
    cmds.button(l='WidgetButton3',p=wgt)
    return wgt

def testWin():

    cmds.window( widthHeight=(200, 150) )
    form = cmds.columnLayout()
    myUI['tabLayout1'] = cmds.tabLayout(innerMarginWidth=5, innerMarginHeight=5, p=form)

    myUI['tab1'] = cmds.rowColumnLayout(numberOfColumns=2, p=myUI['tabLayout1'])
    myUI['tab1_button1'] = cmds.button(p=myUI['tab1'])
    cmds.button(p=myUI['tab1'])
    cmds.button(p=myUI['tab1'])

    myUI['tab2'] = cmds.rowColumnLayout(numberOfColumns=2, p=myUI['tabLayout1'])
    cmds.button(p=myUI['tab2'])
    cmds.button(p=myUI['tab2'])
    cmds.button(p=myUI['tab2'])

    cmds.tabLayout( myUI['tabLayout1'], edit=True, tabLabel=((myUI['tab1'], 'One'), (myUI['tab2'], 'Two')) )

    cmds.showWindow()


testWin()

# create a tab
tabMan = TabSet(myUI['tabLayout1'])
new_tab = tabMan.addTab('myAddition')

# update the color
cmds.button(myUI['tab1_button1'], e=True, bgc=[.1,1,.5])

# adding a widget to the tab3 we just created
myUI['tab3_widget1'] = toolWidget(new_tab)

我想我终于明白了!就添加到UI而言,我可以通过 当我为选项卡设置父项时,只需使用tw=TabWindow创建的UI实例设置父项,它应该是parent=tw.tabA和parent=tw.tabB


我真的应该更仔细地阅读这篇文章

谢谢,我没有意识到它有多混乱。我非常专注于让它发挥作用。你不会碰巧知道我将如何使用此设置来创建新选项卡内容,对吗?比如,如果我要创建一个def fillTabB,并希望在按钮运行时将其作为fillTabA的父对象?那么,如果按下按钮,您想向我的选项卡B添加内容吗?这需要稍微不同的设置。由于您希望访问该选项卡,因此在init中定义一个可以被所有方法访问的变量非常有用,我将尝试编辑答案,使其反映您的问题。谢谢!我使用您和DrWeeny提供的内容编辑了我的问题,因此我希望这更具可读性,更好地说明我的问题,以寻求帮助!我不太清楚你说的提供可执行代码是什么意思。这根本不是为你运行的吗?如果你打开一个新的maya并运行你给我们的,它不会运行谢谢!我已经用haggi kreys模板编辑了我的问题,所以我希望这个版本不那么混乱。这应该以全新的方式运行,而不是使用可以从类继承的词汇表。否则我想我的答案可以帮助你解决你的问题
import maya.cmds as cmds
import re

global myUI
myUI = {}

# please use for def lower case for the first letter and upper case for class
def nameDialogBox(*args):
    print('prompt')

class TabSet(object):
    # don't put self here, they are implicit
    gtF0 = []
    gtF1 = []
    def __init__(self, parent=None):
        self.name = parent

    def addTab(self, name):
        nb = cmds.tabLayout(self.name, q=True, tabLabelIndex=True)
        index = len(nb) +  1

        myUI['tab{}'.format(index)] = cmds.columnLayout(p=self.name)

        cmds.tabLayout( self.name, q=True, tabLabel=True)

        cmds.tabLayout( self.name, edit=True, tabLabel=[myUI['tab{}'.format(index)], name])

        return myUI['tab{}'.format(index)]

    def listTabs(self):

        keys = [i for i in myUI.keys() if re.match('^tab\d+$', i)]
        keys = sorted(keys)
        output = [myUI[k] for k in keys]

        return output

def toolWidget(parent=str):
    wgt = cmds.rowColumnLayout(numberOfColumns=2, p=parent)
    cmds.button(l='WidgetButton1', p=wgt)
    cmds.button(l='WidgetButton2',p=wgt)
    cmds.button(l='WidgetButton3',p=wgt)
    return wgt

def testWin():

    cmds.window( widthHeight=(200, 150) )
    form = cmds.columnLayout()
    myUI['tabLayout1'] = cmds.tabLayout(innerMarginWidth=5, innerMarginHeight=5, p=form)

    myUI['tab1'] = cmds.rowColumnLayout(numberOfColumns=2, p=myUI['tabLayout1'])
    myUI['tab1_button1'] = cmds.button(p=myUI['tab1'])
    cmds.button(p=myUI['tab1'])
    cmds.button(p=myUI['tab1'])

    myUI['tab2'] = cmds.rowColumnLayout(numberOfColumns=2, p=myUI['tabLayout1'])
    cmds.button(p=myUI['tab2'])
    cmds.button(p=myUI['tab2'])
    cmds.button(p=myUI['tab2'])

    cmds.tabLayout( myUI['tabLayout1'], edit=True, tabLabel=((myUI['tab1'], 'One'), (myUI['tab2'], 'Two')) )

    cmds.showWindow()


testWin()

# create a tab
tabMan = TabSet(myUI['tabLayout1'])
new_tab = tabMan.addTab('myAddition')

# update the color
cmds.button(myUI['tab1_button1'], e=True, bgc=[.1,1,.5])

# adding a widget to the tab3 we just created
myUI['tab3_widget1'] = toolWidget(new_tab)