1

所以这第一部分对代码应该没有太大影响,但仅供任何知道它的人参考,我在 The Foundry 的“Nuke”中编写这个。创建一个 pythonPanel GUI。

所以当我创建我的面板时,它开始:

class notePanel(nukescripts.PythonPanel):
    def __init__(self):
        nukescripts.PythonPanel.__init__(self, 'Note Panel', 'com.ohufx.notePanel')

使用init (self): 部分。

当我在这个面板中添加旋钮或 UI 控件时,我会使用一些类似的东西:

    self.proj = nuke.String_Knob('proj', 'Project:', os.environ['SHOW'])
    self.addKnob(self.proj)
    self.proj.setFlag(nuke.STARTLINE)

哪个工作正常。此外,当我创建在面板中运行的脚本时,我会执行以下操作:

def launchSGPage(self):
    pr = self.proj.value()
    sh = self.shot.value()
    url = shotgun.getURL(pr,sh)
    webbrowser.get('/usr/bin/google-chrome %s').open(url)

也使用self,效果很好。

我的问题是,在我的第一步中,当我添加旋钮时(就像我创建的字符串旋钮)并且我想让我的一个函数(如上面的 launchSGPage)运行在特定按钮上的脚本,如果我这样做这个:

    self.sgpage = nuke.PyScript_Knob('sgpage', 'Open SG page', 'self.launchSGPage()')

self.launchSGPage() 给了我一个错误。出于某种原因,self 在这种情况下不起作用,到目前为止,我让它起作用的唯一方法是在我将它添加到 ui 时命名我的面板(在这种情况下我将它命名为 nPanel)并使用它的名称来调用我的函数,如下所示:

def addnotePanel():
    global nPanel
    nPanel = notePanel()
    return nPanel.addToPane()

所以我的脚本按钮看起来像:

    self.sgpage = nuke.PyScript_Knob('sgpage', 'Open SG page', 'nPanel.launchSGPage()')

这适用于所有意图和目的,但对我来说似乎......肮脏和不干净。我不确定是什么,但有些东西告诉我这有问题。谁能为我清理一个更好的方法来链接到我在这个类中的函数,而不是通过全局变量名?

4

2 回答 2

2

单击按钮时,knobChanged将调用面板的方法。您可以检查您的按钮是否被单击,并像其他任何方法一样调用适当的方法:

class notePanel(nukescripts.PythonPanel):
    def __init__(self):
        nukescripts.PythonPanel.__init__(self, 'Note Panel', 'com.ohufx.notePanel')

        self.sgpage = nuke.PyScript_Knob('sgpage', 'Open SG page', '')

    def knobChanged(self, knob):
        if knob is self.sgpage:
            self.launchSGPage()

    def launchSGPage(self):
        pr = self.proj.value()
        sh = self.shot.value()
        url = shotgun.getURL(pr,sh)
        webbrowser.get('/usr/bin/google-chrome %s').open(url)
于 2014-05-31T06:44:33.667 回答
0

使用 self 会给您一个错误,因为您将此脚本作为字符串提供。它是在不同的词汇环境中评估的,即使有一些东西绑定到自我,你想要使用的也不是“你的”自我。

我理解为什么使用这样的全局变量会让你感到恶心。我也会有的。你基本上有两个选择:

  • 尝试将 lambda 作为第三个参数传递给 PyScript_Knob 构造函数,如下所示:

    self.sgpage = nuke.PyScript_Knob('sgpage', 'Open SG page', lambda: self.launchSGPage())
    
  • 如果这不起作用(我没有使用过 nuke,所以我不知道他们是否支持这一点),请查看此处提供的文档:http: //docs.thefoundry.co.uk/nuke/63/pythonreference/ nuke.PyScript_Knob-class.html,我只会编写我自己的 Script_Knob 子类,它允许采用这样的 lambda。我猜你只需要覆盖构造函数,以及execute()使它工作的方法。command()覆盖和的奖励积分setCommand()

于 2013-10-16T15:13:43.463 回答