我想知道是否有一种方法可以用选项填充选项菜单,然后每个不同的选项都会为构建按钮提供不同的功能
例如:
Type = cmds.optionMenu('type',w = 300 ,label = 'Type of crowd:')
cmds.menuItem( label='Walking' )
cmds.menuItem( label='Running' )
cmds.menuItem( label='Cheering' )
cmds.button('Build',command = bld)
def walk(*args):
print (walking)
def run(*args)
print (running)
def cheer(*args)
print (cheer)
因此,如果选择的菜单项将是步行,则按钮命令将执行命令wak 如果所选的菜单项正在运行,那么按钮命令将执行命令运行等等.... 这甚至可能在maya python中...... ????
答案 0 :(得分:1)
这个问题有三个部分。
首先,您希望您的选项是callables。我喜欢functools.partial,因此您可以为相同的命令提供不同的参数,并将其视为两个不同的操作:
from functools import partial
bigcircle = functools.partial ( cmds.circle, radius = 10)
littleCircle = functools.partial (cmds.circle, radius = 1)
第二个问题是OptionMenus中的menuItems不直接触发它们的命令。它们在拥有的optionMenu上触发-cc change命令。所以我们需要能够将标签变回可调用对象的东西。一个小班级会做:
class menuMgr(object):
'''call the function associated with a key in the **callables dictionary'''
def __init__(self, **callables):
self.Callables = callables
def __call__(self, *args):
self.Callables[args[-1]]()
第三部分是将这些与标签相匹配。您可以使用** kwargs语法优雅地执行此操作,您可以在其中传入整个字典或命名关键字:
def menu_of_functions(**callables):
mmgr = menuMgr(**callables)
Main = cmds.optionMenu('type3',w = 300 ,label = 'Type of crowd:', cc = mmgr)
for key, partial in callables.items():
cmds.menuItem(label = key)
cmds.setParent("..")
以工作形式审视整个事情:
import maya.cmds as cmds
import functools
bigCircle = functools.partial ( cmds.circle, radius = 10)
littleCircle = functools.partial (cmds.circle, radius = 1)
class menuMgr(object):
def __init__(self, **callables):
self.Callables = callables
def __call__(self, *args):
self.Callables[args[-1]]()
def menu_of_functions(**callables):
mmgr = menuMgr(**callables)
Main = cmds.optionMenu('type3',w = 300 ,label = 'Type of crowd:', cc = mmgr)
for key, partial in callables.items():
cmds.menuItem(label = key)
cmds.setParent("..")
q = cmds.window()
cmds.columnLayout()
menu_of_functions(big = bigCircle, small = littleCircle)
cmds.showWindow(q)
答案 1 :(得分:0)
当然可以,因为函数是python中的第一类对象。
假设您有一系列功能。
fns = [walk, run, cheer]
1)您需要从字符串键到python函数的映射。 让我们使用词典理解。
options = dict((fn.__name__, fn) for fn in fns)
或者,您可以使用任意键构建字典。
options = {"Walking": walk, "Running": run, "Cheering": cheer}
2)通过访问带有函数名称的字典项来获取对该函数的引用。
options['run'](*args)
3)???
4)利润
答案 2 :(得分:0)
今天有机会对此进行一些研究,但我实际上并没有使用Maya Python,所以这可能不是可行的代码 - 至少它应该是关闭的!
def walk(*args):
print ("walking")
def run(*args)
print ("running")
def cheer(*args)
print ("cheer")
fncdict = {"Walking":walk,"Running":run,"Cheering":cheer}
def dofunc(funcname):
try: fncdict[funcname]()
except KeyError: print("adsmith doesn't really know how this crap works,
and gave you some really shoddy advice. Go downvote
his answer.")
Type = cmds.optionMenu('type',w = 300 ,label = 'Type of crowd:')
# Please don't name things this way! naming conventions in PEP 8
# make this look like a class not an instance of optionMenu
cmds.menuItem( label='Walking', parent = Type )
cmds.menuItem( label='Running', parent = Type )
cmds.menuItem( label='Cheering', parent = Type )
cmds.button('Build',command = lambda x: dofunc(Type.value))
# I'm assuming this is the button you want to use to say "GO", right?
从我读过的那篇文章中,看起来optionMenu.value
指的是活跃menuItem
中的文字,但我不能肯定地说 - 它可能就是那个文本optionMenu
在这种情况下,该按钮会调用dofunc('Type of crowd:')
,这将返回我为羞辱自己而构建的异常。
这是我知道的另一种选择,但它很丑陋且没必要。
# all
# those
# functions
# go
# here
# including
# the dict and dofunc
activeMenuItem = None
Type = cmds.optionMenu('type',w = 300 ,label = 'Type of crowd:',
changeCommand = lambda x: activeMenuItem = x)
# this fails because you can't do assignments in a lambda -- OOPS!!
cmds.menuItem( label='Walking', parent = Type )
cmds.menuItem( label='Running', parent = Type )
cmds.menuItem( label='Cheering', parent = Type )
cmds.button('Build',command = lambda x: dofunc(activeMenuItem))
每次更改项目时都会调用changeCommand
中的optionMenu
选项。我已将其分配给lambda
,将变量activeMenuItem
更新为新活动menuItem
中的值,然后按钮引用变量而不是查询{{1} }对于它当前选择的按钮,但说实话 - 这就是MADE要做的菜单。绝对是一种方法,无需存储每一个选择。
答案 3 :(得分:0)
我有点想办法解决这个问题 cmds.optionMenu('Greetings',Label ='Greet') cmds.menuItem(label = hi,parent ='Greetings) cmds.menuItem(label = Hello,parent ='Greetings')
def Greet(* args) menuItems = cmds.optionMenu('Greetings',q = True,v = True) 如果menuItems = hi 打印“嗨” menuItemsnew = cmds.optionMenu('Greetings',q = True,v = True) 如果menuItemsnew =你好 打印“你好”
这应该有用,对我有用