连续创建多个实例时使用正确的 class 个实例
Using correct class instance when making multiple instances in succession
当我连续创建多个选项卡时我的脚本出现问题。如果我创建两个选项卡,然后尝试编辑第一个选项卡;它更改了第二个选项卡而不是第一个。
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()
我的印象是,为了实现这一点,我需要让每组选择成为 class 的一个实例,以便我可以编辑它们。考虑到这一点,我移动了
def select_joints_afk(self):, def select_joints_aikw(self):, & def select_joints_ikpv(self):
像这样创建选择链 class..
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 Class 方法中创建的 def appendJointChain(self, *args):
:
self.joint_chain_select = Create_Selection_Chains( self, "foo", "bar", "baz")
我对此进行了多次尝试(如上图 Create_Selection_Chains class 所示),但我似乎无法做到正确。
# 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 中创建的选项卡成为他们自己的 class 或 Create_Selection_Chains class 的一部分,但我真的在这一点上不确定。
有人可以解释发生了什么以及我如何解决这个问题吗?
由于您的代码有些混乱,很难给您一些建议。由于您正在创建一个界面并且无论如何您都使用 pymel,我建议将所有内容都放在一个 class 中并在这个 class 中构建所有内容。例如你想创建一个带有两个选项卡的 window 可以这样工作:
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
我真的应该更仔细地阅读这篇文章
当我连续创建多个选项卡时我的脚本出现问题。如果我创建两个选项卡,然后尝试编辑第一个选项卡;它更改了第二个选项卡而不是第一个。
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()
我的印象是,为了实现这一点,我需要让每组选择成为 class 的一个实例,以便我可以编辑它们。考虑到这一点,我移动了
def select_joints_afk(self):, def select_joints_aikw(self):, & def select_joints_ikpv(self):
像这样创建选择链 class..
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 Class 方法中创建的 def appendJointChain(self, *args):
:
self.joint_chain_select = Create_Selection_Chains( self, "foo", "bar", "baz")
我对此进行了多次尝试(如上图 Create_Selection_Chains class 所示),但我似乎无法做到正确。
# 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 中创建的选项卡成为他们自己的 class 或 Create_Selection_Chains class 的一部分,但我真的在这一点上不确定。 有人可以解释发生了什么以及我如何解决这个问题吗?
由于您的代码有些混乱,很难给您一些建议。由于您正在创建一个界面并且无论如何您都使用 pymel,我建议将所有内容都放在一个 class 中并在这个 class 中构建所有内容。例如你想创建一个带有两个选项卡的 window 可以这样工作:
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
我真的应该更仔细地阅读这篇文章