从nuke中的文件夹创建下拉,然后首先评估下拉以填充第二次下拉inpython

时间:2014-08-23 23:05:22

标签: python syntax panels nuke

我正在尝试创建一个在nuke启动时打开的面板,并设置一些参数。

我想要做的是在同一个面板上有一系列下拉菜单,下拉菜单中的项目将来自文件夹。

我遇到的问题是,我想设置第一个下拉并从选择下拉第二个拉下来反映出那个选择和它的菜单项反映出每次拉下来的变化等等,基本上都是挖掘在文件夹结构中,但每个下拉结果都使用一个变量。

我没有走得太远,但是

    import os
import nuke
import nukescripts

## define panel

pm = nuke.Panel("project Manager")

## create pulldown menus

jobPath = pm.addEnumerationPulldown( 'project', os.walk('/Volumes/Production_02/000_jobs/projects').next()[1])


seqPath = pm.addEnumerationPulldown('sequence', os.walk('/Volumes/Production_02/000_jobs/projects').next()[1])


shotPath = pm.addEnumerationPulldown('shot', os.walk('/Volumes/Production_02/000_jobs/projects').next()[1])


print jobPath
print seqPath
print shotPath

#pm.addKnob(job)
#pm.addKnob(seq)
#pm.addKnob(shot)

pm.show()

下拉中出现的字符串也会被[''等等?

包围

欢呼声 - 亚当

1 个答案:

答案 0 :(得分:0)

您可能希望使用PythonPanel,而不是旧式Panel,它基本上是一个TCL包装器。这样,当面板中的旋钮发生变化时,您可以获得回调。

这是一个基本的例子:

导入os

import nuke
import nukescripts.panels


class ProjectManager(nukescripts.panels.PythonPanel):
    def __init__(self, rootDir='/Volumes/Production_02/000_jobs/projects'):
        super(ProjectManager, self).__init__('ProjectManager', 'id.ProjectManager')

        self.rootDir = rootDir
        self.project = self.sequence = self.shot = None

        projectDirs = [x for x in os.listdir(rootDir)
                       if os.path.isdir(os.path.join(rootDir, x))]
        self.project = projectDirs[0]
        self.projectEnum = nuke.Enumeration_Knob('project', 'project', projectDirs)
        self.addKnob(self.projectEnum)

        self.seqEnum = nuke.Enumeration_Knob('sequence', 'sequence', [])
        self.addKnob(self.seqEnum)

        self.shotEnum = nuke.Enumeration_Knob('shot', 'shot', [])
        self.addKnob(self.shotEnum)

        self._projectChanged()

    def _projectChanged(self):
        self.project = self.projectEnum.value()
        projectDir = os.path.join(self.rootDir, self.project)
        projectSeqDirs = [x for x in os.listdir(projectDir)
                          if os.path.isdir(os.path.join(projectDir, x))]
        self.seqEnum.setValues(projectSeqDirs)
        self._sequenceChanged()

    def _sequenceChanged(self):
        s = self.seqEnum.value()
        if s:
            self.sequence = s
            seqDir = os.path.join(self.rootDir, self.project, s)
            seqShotDirs = [x for x in os.listdir(seqDir)
                           if os.path.isdir(os.path.join(seqDir, x))]
        else:
            self.sequence = None
            seqShotDirs = []
        self.shotEnum.setValues(seqShotDirs)
        self._shotChanged()

    def knobChanged(self, knob):
        if knob is self.projectEnum:
            self._projectChanged()
        elif knob is self.seqEnum:
            self._sequenceChanged()
        elif knob is self.shotEnum:
            self.shot = self.shotEnum.value()


p = ProjectManager()
if p.showModalDialog():
    print p.project, p.sequence, p.shot

请注意,此示例仅用于演示PythonPanel子类的基本设计。它有一些小的逻辑问题(在Nuke的背景下),并且尽可能清晰地编写,而不是尽可能高效或惯用。

无论如何,希望这可以让你了解如何构建你想要的东西。