2014-01-10 3 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

Я на самом деле не знаю, как осуществить это, но вы должны найти способ, чтобы вытащить 'label 'из выбранного' menuItem', постройте идентификатор этих меток (например, 'funcdict = {« Ходьба »: прогулка« Бег »: бегите,« Cheering »: cheer}') и делайте '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

Поскольку у него уже есть пункты меню, я рекомендую, чтобы он просто сопоставлялся с помощью меток для элементов меню, например. 'options = {" Walking ": walk, ...}' no reason to map from 'fn .__ name__' to' 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)) 

changeCommand вариант в optionMenu вызывается каждый раз, когда вы изменяете элементы. Я назначил его lambda, который обновляет переменную activeMenuItem до значения в новом активном menuItem, после чего кнопка ссылается на переменную вместо запроса optionMenu для выбранной в данный момент кнопки, но давайте будем честными - это то, что меню сделаны. Существует ОПРЕДЕЛЕННО способ сделать это, не сохраняя каждый отдельный выбор.

РЕДАКТИРОВАТЬ: ЭТО ПОСЛЕДНЕЕ НЕ БУДЕТ РАБОТАТЬ, ЧТО ВЫ НЕ МОЖЕТЕ СДЕЛАТЬ ЗАПИСИ В РАМКАХ ВЫПОЛНЕНИЯ ЛАМБЫ. МОЯ ВИНА!

+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

Oh shoot you can Не делай присваивания в лямбде, это правильно. Не уверен тогда - вам придется проконсультироваться с вашей документацией, поскольку я никогда раньше не работал с этой реализацией Python. Сожалею! –

+0

@Arnvfx, если бы я сказал вам написать мне код, который вернул атрибут 'label' активного' menuItem' - как бы вы его написали? –

1

В комплект поставки входят три части.

Прежде всего, вы хотите, чтобы ваши параметры были вызывающими. Мне нравится functools.partial для того, чтобы вы могли дать ту же самую команду различных параметров и он должен рассматриваться как два различных действия:

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

Вторая проблема заключается в том, что MenuItems в OptionMenus не срабатывают их команды напрямую , Они запускают команду -cc change на опции ownerMenu. Поэтому нам нужно что-то, что вернет ярлык обратно в вызываемый объект. Немного класс будет делать:

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("..") 

Heres все дело в рабочей форме, чтобы проверить:

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

Это будет просто кнопка (label = "some label here", c = bigCircle). Частицы отлично подходят для кнопок. кнопка (label = "little", c = partial (cmds.button, radius = 1)) тоже работает – theodox

0

I имеют вид более простой путь к этой проблеме cmds.optionMenu ('Greetings', Label = 'Greet') cmds.menuItem (label = hi, parent = 'Greetings) cmds.menuItem (label = Hello, parent = 'Приветствия')

Защиту Приветствуйте (* арг) MenuItems = cmds.optionMenu ('Привет', Q = True, v = True), если MenuItems = привет печать "привет" menuItemsnew = cmds.optionMenu ('Привет', Q = True , v = True), если menuItemsnew = привет печать «привет»

Это должно работать, он работал для меня

Смежные вопросы