2014-01-10 55 views
1

我想知道是否有填充帶有多個選項的選項菜單,然後每個不同的選擇的方式給出了構建按鈕不同的功能基於期權執行不同的功能

爲如:

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 ,如果選擇的菜單項將運行,那麼按鈕命令將執行命令運行等等...... 是這樣甚至可能在瑪雅蟒蛇...... ????

+0

我真的不知道如何實現這一點,但你應該找到一種方式來拉所選'menuItem'中的'label',構建這些標籤的詞典(例如'funcdict = {「散步」:散步,「跑步」:跑步,「歡呼」:歡呼}'),並做'funcdict [sel_menu_item](* args)'。作爲一個附註,我將'chr'函數重命名爲'cheer'--它是一個關鍵字。 –

+0

感謝您的快速回復將嘗試它,讓你知道它是怎麼回事! – Arnvfx

回答

0

當然你可以,因爲函數是python中的第一類對象。

比方說,你有一個功能列表。

fns = [walk, run, cheer]

1)你需要從一個字符串鍵蟒蛇功能的映射。 讓我們使用詞典理解。

options = dict((fn.__name__, fn) for fn in fns)

或者你可以建立任意鍵的字典。

options = {"Walking": walk, "Running": run, "Cheering": cheer}

2)通過訪問與該功能名稱詞典項獲取對函數的引用。

options['run'](*args)

3)???

4)利潤

+0

由於他已經有menuItems,我推薦他只是使用menuItems的標籤進行映射,例如, 'options = {「Walking」:walk,...}'沒有理由從'fn .__ name__'映射到'fn' –

+0

不夠公平。我會盡快修改我的答案。 –

+0

這是偉大的意見,但我將如何將這些功能附加到按鈕的命令標誌...? – Arnvfx

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)) 

optionMenuchangeCommand選項被稱爲每次更改項目的時間。我已將它分配到lambda,它將變量activeMenuItem更新爲新激活的menuItem中的值,然後讓該按鈕引用該變量而不是查詢optionMenu當前選定的按鈕,但讓我們誠實 - 這就是菜單是MADE做的。毫無疑問,這是一種不存儲每一個選擇的方法。

編輯:這最後一個將無法正常工作,因爲您不能在LAMBDA表達式中進行分配。我的錯!

+0

嘿謝謝你的幫助,但Type = cmds.optionMenu('type',w = 300,label ='人羣類型:', changeCommand = lambda x:activeMenuItem = x)給我一個語法錯誤!有沒有其他的方式..?因爲我可以通過使用cmds.optionMenu('Type',q = True,v = True)來查詢菜單項中的文本是否會幫助我嘗試執行此cmds.button('Build',label ='Build',w = 300,h = 50,bgc =(0,1,0),actOnPress = True,command = cmds.optionMenu('Type',q = True,v = True))但它沒有工作 – Arnvfx

+0

哦,拍你可以在拉姆達內不做任務,沒錯。不確定 - 那麼你必須諮詢你的文檔,因爲我以前從來沒有使用Python的這個實現。抱歉! –

+0

@Arnvfx如果我告訴你寫我返回活動'menuItem'的'label'屬性的代碼 - 你會怎麼寫? –

1

這個問題有三個部分。

首先,你希望你的選項是可以調用的。我喜歡爲functools.partial,這樣就可以給相同的命令不同的參數,並把它作爲被兩個不同的動作處理:

from functools import partial 
bigcircle = functools.partial (cmds.circle, radius = 10) 
littleCircle = functools.partial (cmds.circle, radius = 1) 

第二個問題是,在OptionMenus的菜單項不直接解僱他們的命令。他們觸發擁有optionMenu的-cc更改命令。所以我們需要一些將標籤變回可調用對象的東西。一個小類將做:

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) 
+0

有沒有辦法執行通過選擇按鈕而不是突出顯示的命令..? – Arnvfx

+0

這只是按鈕(標籤=「這裏有一些標籤」,c = bigCircle)。部分是偉大的按鈕。按鈕(標籤=「小」,c =部分(cmds.button,半徑= 1))也適用 – theodox

0

我(標籤=你好,親= =問候) cmds.menuItem(label = Hello,parent) ='問候')

DEF問候(*參數) 的菜單項= cmds.optionMenu( '問候',Q =真,V =真) 如果的菜單項=喜 打印的 「hi」 menuItemsnew = cmds.optionMenu( '問候',Q =真,v = TRUE) 如果menuItemsnew =你好 打印「你好」

這應該工作,它爲我工作