根据选择的选项执行不同的功能

时间:2014-01-10 05:11:24

标签: python button drop-down-menu maya

我想知道是否有一种方法可以用选项填充选项菜单,然后每个不同的选项都会为构建按钮提供不同的功能

例如:

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中...... ????

4 个答案:

答案 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要做的菜单。绝对是一种方法,无需存储每一个选择。

编辑:这最后一个不会工作,因为你不能在LAMBDA表达中作出任务。我的错误!

答案 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 =你好         打印“你好”

这应该有用,对我有用