2017-03-24 6 views
0

함수를 반환하는 데 약간의 문제가 있습니다. 나는 사용자에게 디렉토리를 묻고 현재 날짜, 시간 등을 포함한 쓰기 노드에서이 디렉토리의 경로를 자동으로 설정하는 핵 스크립트를 만들고 싶습니다.이 부분은 매우 쉬웠습니다 (제공된 코드의 DateWrite() 함수 임)Python Nuke - 다른 함수의 변수 결과를 사용하는 방법

이제 렌더가 끝난 후에이 디렉토리를 열고 싶습니다. 그래서 콜백을 사용하고 주어진 디렉토리를 여는 함수를 호출해야합니다.

이것은 몇 가지 문제가 있습니다. 첫 번째 기능에서 디렉토리가 설정되었으므로 return으로이 기능의 값을 얻으려고했습니다.

그것은 작동하지만 (이 부분은 openDirectoryAfterRender() 기능입니다)

#Modules import 
import nuke 
import subprocess 

# Create DateWrite function 
def DateWrite(): 

    # Create Variables 
    selectedNodes = nuke.selectedNodes() # Get Selection of all selected nodes 

    if len(selectedNodes) == 1: 
     filePath = nuke.getFilename('Set Output Directory') # Asks the user to set an OutPut directory for the Write Node 

     writeNode = nuke.createNode("Write") # Create a Write Node 
     writeNode['file'].setValue(filePath + "[file rootname [file tail [value root.name]]]_[date %y][date %m][date %d]_[date %H][date %M].png") # Set the Write Node with TCL 
     writeNode['afterRender'].setValue('openDirectoryAfterRender()') # Add a callback which will call the function openDirectoryAfterRender() 

    else: 
     nuke.message("No node selected or more than one node are selected.\nPlease select only one node.") 
    return filePath 

# Create openDirectoryAfterRender 
def openDirectoryAfterRender(): 
    directoryToOpen = DateWrite() # Get the returned directory from DateWrite() -but also execute DateWrite another time- 
    directoryToOpen = directoryToOpen.replace('/','\\') # Replace the slashes with backslashes 

    subprocess.Popen('explorer %s' % directoryToOpen) # Open the chosen directory 

내가 파이썬과 일반적으로 코드를 꽤 새로운 오전 두 번 첫 번째 함수를 사용하는 저를 강제로, 그래서 이것은 아마 멍청한 놈 질문입니다 . 여러 솔루션을 시도했는데,이 중 가장 가까운 것이 내가 원하는 것에서 얻을 수있는 가장 가까운 솔루션입니다.

고맙습니다.

+0

"처음 함수를 두 번 사용하도록합니다." 'def DateWrite() :'함수는 함수를 정의하고 호출하지 않습니다. 여러분의 코드가 이제,'DateWrite'를 정확히 한 번 실행합니다. 아니면''directoryToOpen'에 두 번 할당하도록 강요합니까? 'directoryToOpen = DateWrite(). replace ('/', '\\')'와 함께 한 행에서 처리 할 수 ​​있습니다. – Kevin

+0

@Kevin이 제안한 유일한 단점은 DateWrite가'None'을 되 찾으면 속성 오류가 발생한다는 것입니다. 'len (selectedNodes)! = 1'이면'DateWrite()'는'None'을 반환합니다. – Pericolo

+0

'len (selectedNodes)! = 1'이라면 지금 당장 생각해 봅니다. 'filePath'에 아무 것도 할당되지 않았기 때문에'return'에'UnboundLocalError'로 충돌합니다. – Kevin

답변

0

콜백에 대해 혼란스러워합니다. 다른 함수 또는 외부에서 DataWrite를 호출해야합니다. 다음은 코드의 업데이트 된 버전이며 핵으로 테스트 한 코드입니다.

import nuke 
import subprocess 

# Create DateWrite function 
def DateWrite(): 

    # Create Variables 
    selectedNodes = nuke.selectedNodes() # Get Selection of all selected nodes 

    if len(selectedNodes) == 1: 
     filePath = nuke.getFilename('Set Output Directory') # Asks the user to set an OutPut directory for the Write Node 

     writeNode = nuke.createNode("Write") # Create a Write Node 
     writeNode['file'].setValue(filePath + "[file rootname [file tail [value root.name]]]_[date %y][date %m][date %d]_[date %H][date %M].png") # Set the Write Node with TCL 
     writeNode['afterRender'].setValue('openDirectoryAfterRender(%s)' % filePath) # Add a callback which will call the function openDirectoryAfterRender() 

    else: 
     nuke.message("No node selected or more than one node are selected.\nPlease select only one node.") 

# Create openDirectoryAfterRender 
def openDirectoryAfterRender(directoryToOpen): 
    directoryToOpen = directoryToOpen.replace('/','\\') # Replace the slashes with backslashes 

    subprocess.Popen('explorer %s' % directoryToOpen) # Open the chosen directory 

directoryToOpen = DateWrite() # Get the returned directory from DateWrite() -but also execute DateWrite another time-