2016-10-22 2 views
0

특정 제약으로 인해 평소와 같이 클래스를 사용할 수 없습니다.함수 내에서 함수에 변수를 전달하려고합니다. - Python

변수에 함수를 전달해야하지만이 함수는 다른 함수 안에 있습니다.

다음 코드는 내가 사용하고있는 코드입니다. 제발 친절 해주세요. 저는 파이썬 마법사가 아니며 독학합니다. 내가 겪고있는 문제는 nButtons가 함수 reColor에서 False를 반환하고 있다는 것입니다.

import maya.cmds as cmds 

nButtons = 4 

def ColorMeButtonsUI(nButtons): 
    def reColor(nButtons): 
     for i in range(nButtons): 
      cmds.button(str(i), edit = True, bgc = (1,1,1)) 

    if cmds.window('colorUI', exists= True): 
     cmds.deleteUI('colorUI') 

    if not nButtons: 
     nButtons = 3 

    if nButtons >= 2 and nButtons < 10: 
     colorUI = cmds.window('colorUI', title='Color me, Buttons', widthHeight=(200, 55), rtf = True ) 
     cmds.columnLayout(adjustableColumn=True) 
     cmds.button('Color', label='Color', command = reColor) 
     for i in range(nButtons): 
      cmds.button(str(i), label = 'Color'+str(i+1)) 
     cmds.setParent('..') 
     cmds.showWindow(colorUI) 
    else: 
     cmds.error ('Input is invalid. Please confirm input >1 and <10') 
    return nButtons 

ColorMeButtonsUI(nButtons) 

편집 : 명령은 GUI 버튼에 의해 운영되고있다 : cmds.button('Color', label='Color', command = reColor)

+0

에서 UI를 만드는 방법에

더'reColor'는 아무 것도 반환하지 않습니다. 들여 쓰기가 정확한지 확인하십시오. – Philipp

+0

붙여 넣은 코드가 들여 쓰기가 맞습니까? –

답변

0

오신 것을 환영합니다, 당신은 이미 망가 자신을 반복을 시도하고, 니스 BGC를 편집 범위를 반복 유래 할 수 있습니다. 그러나 평소와 같이 클래스를 사용하여 만든 라이브러리에 Dictionary 라이브러리를 사용하고 ui dag 경로로 호출하십시오. 인스턴스는 처리 할 수있는 정보가있는 사용자의 dict 항목을 반복 할 범위를 반복합니다.

import maya.cmds as cmds 
nButtons = 5 
# create a dict for the buttons 
ui_dict = {} 
def ColorMeButtonsUI(nButtons): 
    def reColor(*args): 
     # iterate the dict with the created buttons inside 
     for ui_id, ui_dag in ui_dict.iteritems(): 
      print ui_id, ui_dag 
      # and edit ther color 
      cmds.button(ui_dag, edit = True, bgc = (1,1,1)) 
      # you can also search for ids eg: 
      if str(2) in str(ui_id): 
       print ui_dag 

    if cmds.window('colorUI', exists= True): 
     cmds.deleteUI('colorUI') 

    if not nButtons: 
     nButtons = 3 
    # you can also use 
    # if 10>nButtons>= 2: 
    if nButtons >= 2 and nButtons < 10: 
     colorUI = cmds.window('colorUI', title='Color me, Buttons', widthHeight=(200, 55), rtf = True ) 
     cmds.columnLayout(adjustableColumn=True) 
     cmds.button('Color', label='Color', command = reColor) 
     #use the range start,end 
     for i in range(1,nButtons): 
      #create a relativ linking instance hard coded ids 
      #add element to dict 
      # we stay on your case and add the index too(not more needed except searching) 
      ui_dict[(i)] = cmds.button(label = 'Color'+str(i)) 
     cmds.setParent('..') 
     cmds.showWindow(colorUI) 
    else: 
     cmds.error ('Input is invalid. Please confirm input >1 and <10') 
    return nButtons 

ColorMeButtonsUI(nButtons) 
0

다른 기능 안에서는 기능을 생성하지 않는 것이 좋습니다.

당신이 외부 기능 추가하는 경우 :

def reColor(nButtons): 
     for i in range(nButtons): 
      cmds.button(str(i), edit = True, bgc = (1,1,1)) 


def ColorMeButtonsUI(nButtons): 
(...) 

당신이 ColorMeButtonsUI 내부에서 칠을 사용할 수있게됩니다.

또한, 당신은 당신이

from functools import partial 

을 사용하지 않는 버튼을 통해 명령을 호출 인수 (이 경우 nButtons)를 보내 그리고 그 인수를 명령에() 부분 사용할 수 있습니다. this other post을 읽어 보시기 바랍니다. 단지 레코드에 대한

내 조언 :

  • 지켜보십시오 identation. 식별 수준마다 4 칸. 탭이 없습니다.
  • 함수 정의에 대문자를 사용하지 마십시오. 클래스 이름에만 해당됩니다. 따라서 "colorMeButtonsUI"여야합니다.
  • colorMeButtons 내에서만 reColor를 사용하려는 경우 대신 __reColor (nButtons)를 호출 할 수 있으므로 파이썬에 이와 같은 기능은 없지만 목록에서 함수 이름을 숨기므로 비공개가 아닙니다. 이 파일의 사용 가능한 구성 요소). 또는 _reColor에 밑줄이 하나 있으면이 함수는이 파일 내에서만 사용됩니다.
0

문제는 파이썬이 루프 변수를 처리하는 방식과 관련이 있습니다. 루프에서 무언가를 만들려고 할 때, 파이썬은 루프 변수를 기억할 것입니다 (이것은 기술적으로는 closure입니다).

보통 이것은 편리합니다. 그러나 루프에서 클로저는 루프가 실행될 때 원하는 값이 아닌 루프의 마지막 값인 을 항상 기억합니다.이 같은 뭔가를 분명 시도 그래서 경우 :

for n in range (nbuttons): 
    def button_func (*_): 
     print "color", n 
    cmds.button(label = "color %i" %n, c = button_func) 

올바르게 표시된 버튼을 얻을 것이다 - 그러나 폐쇄 루프의 끝에서 일어날 것이기 때문에 그들은 모두 nbuttons의 값을 출력한다. 확실히 혼란 스럽습니다.

클로저 규칙은 범위가 끝날 때 발생합니다. 따라서 서브 - 함수 (자체 스코프를 생성 함)를 생성하고 루프에서 그 함수를 호출함으로써 조금 더 일찍 처리 할 필요가 있습니다. 따라서이 generate_button를 arangement에서

def ButtonUI(nbuttons =3): 

    colorUI = cmds.window(title='Color me, Buttons', widthHeight=(200, 55), rtf = True ) 
    cmds.columnLayout(adjustableColumn=True) 
    def generate_button(idx): 
     def callback(*_): # < will inherit the value of idx automatically 
      print "color", idx 
     cmds.button(label = 'color %i' %idx, c = callback) 

    for n in range(1, nbuttons +1): 
     generate_button(n) 
    cmds.showWindow(colorUI) 

idx 값을 잡을 것이다 정확하게 개인 callback 기능을 페어링, 각각의 버튼의 라벨과 동일한 인덱스 값을 출력한다. 하위 하위 함수는 클로저를 사용하여 올바른 값을 저장합니다. functools.partial 개체를 사용하여 동일한 작업을 수행 할 수 있지만 클로저가 필요없는 작업을 한 번 확인하십시오. 루프 현재 형식의 코드에서 here

관련 문제