2012-06-22 2 views
0

Я использую python в Maya, пакет 3D-анимации. Мне было бы интересно выполнить определение (A), но в рамках этого определения мне нужен другой definiton (B), который требует правильного выбора объекта. Сценарий будет продолжаться до тех пор, пока он не будет создан (в def B), и я хочу продолжить свой сценарий (def A) с возвращенным значением из def B. Как я могу сказать def A, чтобы дождаться, пока верное возвращаемое значение будет получено из def B?Как сделать Python Ждать ввода?

Так короткий вопрос: как я могу заставить python ждать действительного возвращаемого значения, которое должно быть получено?

Надеюсь, что у вас есть смысл и спасибо за ваше время.

C

пример:

def commandA() : 
    result = commandB() 
    ### Wait for a value here ### 
    if result == "OMG its a valid selection" : 
     do_another_commandC() 

def commandB() : 
    # This command is kept running until a desired type of selection is made 
    maya.mel.eval("scriptjob \"making a valid selection\" -type polygon") 
    if selection == "polygon" : 
     return "OMG its a valid selection" 
    else : 
     commandB() 

мне нужна вещь в ### линии для функции ждать, пока желаемый возврат не принимается, а затем продолжить с остальными. На данный момент функция просто запускает все независимо.

Спасибо

+1

Что такое «определение»? – BrenBarn

+0

@BrenBarn Вероятно, функция ... – glglgl

+1

Пожалуйста, покажите код, который у вас уже есть, ссылки на документацию, о которой вы знаете, и т. Д. Я бы хотел помочь, но у меня нет опыта работы с Maya. Кроме того, из вашего вопроса неясно, что у вас есть, что работает, и где именно вы застряли. – KobeJohn

ответ

0

Вы могли бы просто использовать время цикла:

def commandA() : 
    result = "" 
    while (result != "OMG its a valid selection") 
     # perhaps put a 0.1s sleep in here 
     result = commandB() 
    do_another_command() 

Я заметил, что

selection в коде не фактически присваивается значение (по крайней мере, не в коде, который вы нам предоставили), это не должно быть:

selection = maya.mel.eval("scriptjob \"making a valid selection\" -type polygon")


Кроме того, есть причина, почему вы звоните commandB рекурсивно? Это может привести к ненужным ресурсам, особенно если кто-то неоднократно делает неправильный выбор. Как насчет этого?

def commandA() : 
    result = "" 
    while (result != "polygon") 
     # perhaps put a 0.1s sleep in here (depending on the behavior of the maya command) 
     result = commandB() 
    do_another_command() 

def commandB() : 
    # This command retrieves the selection 
    selection = maya.mel.eval("scriptjob \"making a valid selection\" -type polygon") 
    return selection 
+0

Активное ожидание не похоже путь. – AoeAoe

+0

Взглянув на код OP, где они рекурсивно вызывают commandB для запуска 'maya.mel.eval (« scriptjob \ "создание допустимого полигона« -типа »), заставляет меня думать, что активное ожидание неизбежно, если только команда майя каким-то образом модифицируется. Кроме того, поскольку команда maya, вероятно, блокирует, цикл while не будет работать очень быстро. – stanri

+0

Сценарий, который я установил в майя, заставит пользователя не в состоянии сделать что-либо еще в майа, пока не будет сделан нужный выбор. Выбор осуществляется щелчком объектов в окне просмотра 3D, поэтому событие не произойдет мгновенно, это может произойти от 1 до 5 минут. Все, что я хочу, - это когда правильный выбор сделан, возвращаемое значение передается команде commandA и продолжает выполнение остальной части скрипта – cloud68

0

Если объем commandB() ограничена commandA(), вы можете рассмотреть возможность использования замыкания (what is a closure?)

или просто вложенные функции питона (http://effbot.org/zone/closure. HTM, http://www.devshed.com/c/a/Python/Nested-Functions-in-Python/)

в любой части вашего кода с учетом результата «= commandB) (» заявление,

interpretter должен ждать, пока что-то не возвращается из commandB() и присваивается результат, прежде чем перейти к следующему линия, чтобы быть xecuted.

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