2012-09-15 2 views
-2

나는 사전에 항목을 더 추가하고 필요한 경우 두 번째 단추를 채우는 것을 시도하고 있습니다 !!! 모든 파란색 재생 버튼을 클릭하여 마야 스크립트 편집기에서 코드를 실행에 잘 간다하지만 난 funtest.main()왜 가져 오기로 모듈을 실행할 때 이름 오류가 발생하지만 마야의 스크립트 편집기에서 실행하지 않는 경우

창로드가 잘 funtest이 스크립트를 수입을 가져올 수 있지만, 만약 내가 중 하나를 클릭에 오류가 버튼 ... 그럼 왜 스크립트 편집기에서 코드를 실행하는 것과 다른 것을 가져 오는 것의 차이점이 무엇인지 말해주세요.

내 논리가 틀리거나 틀린가?

import maya.cmds as cmds 
dic={} 
print("dictionary is empty",dic) 
def main(): 
    inst=btnUI() 
    inst.create() 


class btnUI(object): 
    def __init__(self, winName="winTheWindow"): 
     self.winTitle = "The Window" 
     self.winName = winName 

    def create(self): 
     if cmds.window(self.winName, exists=True): 
      cmds.deleteUI(self.winName) 
     dic['item1']='item1value' 
     dic['item2']='item2value' 

     cmds.window(self.winName, title=self.winTitle) 
     self.mainCol = cmds.columnLayout(adjustableColumn=True) 
     self.btnA = cmds.button(label='Press Me - External Func',c='outsideFunc(dic)') 
     self.btnb = cmds.button(label='Populate more items',c='populateDic()') 
     cmds.showWindow(self.winName) 
     cmds.window(self.winName, edit=True, widthHeight=[250,75]) 



def populateDic(): 
    dic['item3']='item3value' 
    dic['item4']='item4value' 
    dic['item5']='item5value' 

def outsideFunc(dicItems): 
    print("Outside function, called from inside a class function") 
    print(dicItems) 

if __name__ == '__main__': 
    main() 
+2

왜 \ _ \ _ name \ _ \ _을 (를) 재 할당 하시겠습니까? if \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _'은 그런 식으로 결코 사실이 아닙니다. – XORcist

+0

모듈에 이름을 지정하고 싶습니다 !! 그러나 지금은 그것을 고쳤습니다 ... –

+0

두 개의 밑줄 표시된 속성은 특별합니다. 그들과 함께 특별한주의 (RTFM!)해야합니다. – XORcist

답변

0

cmds.button()c 인수의 해상도가 다른 네임 스페이스에서 일어나고 때문입니다. 그 결과 기능 부분에 의해 생산 있도록

버튼 A에 대한
from functools import partial 
self.btnA = cmds.button(label='Press Me - External Func', 
         c=partial(outsideFunc, dic)) 
self.btnb = cmds.button(label='Populate more items',c=populateDic) 

, 나는 outsideFuncdic을 통과하기 위해 partial을 사용하고 있습니다 : 더 파이썬 방법 다음은 그것을 해결하는 방법은 여러 가지가 나타납니다,하지만 난 추천 인수가 필요하지 않습니다 (인수가 dic 인 것으로 사전로드되었습니다).

단추 B의 경우 인수가 필요하지 않으므로 불필요합니다. 그래서 우리는 호출 할 함수의 이름을 부여합니다. 따옴표의 부족을 유의하십시오. 파이썬은 이것을 올바른 네임 스페이스에서 해결할 것이며 예상대로 작동 할 것입니다. BTW

이 페이지는 도움이 될 것으로 보인다 및 명령 콜백에 대해 이야기 :

from functools import partial 
self.btnA = cmds.button(label='Press Me - External Func', 
         c=lambda arg: outsideFunc(dic)) 
self.btnb = cmds.button(label='Populate more items',c=lambda arg: populateDic()) 

이이를 만듭니다 http://www.luma-pictures.com/tools/pymel/docs/1.0/ui.html

UPDATE : 당신이 그것을 포장 할 수 있도록 버튼, 자신의 콜백에 인수를 전달 인자를 버리는 익명의 함수 몇개 (당신이 필요로하지 않기 때문에).

+0

감사 메이트, 나는 pymel 시도한 적이 없지만 나는 그것을 시도해야 줄 알았는데 .. 그래서 내가 수행 externalFunc (dicItems, inst) : populateDic (inst)와 같은 방식으로, 않습니다 즉, inst가 함수 자체, 즉 0 번째 항목이라는 것을 의미합니다. –

+0

나는 포스트를 업데이트했습니다. 분명히 버튼이 인수를 전달합니다. 람다 함수를 사용하여 버릴 수 있습니다. 불행히도 Maya에 대해서는 아무 것도 모릅니다. 그것이 지나가고있는 것, 나도 몰라요. 나의 교육 된 추측은 상태 정보 또는 버튼 객체를 나타내는 무언가 ('자기'와 같은 종류)입니다.하지만 확실하지 않습니다. – jszakmeister

+0

감사합니다. 정말로 감사합니다. 도움!!! –

관련 문제