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 を使用すると、うまく機能します。

私の問題は、最初のステップで、ノブ (作成したストリングノブのように) を追加し、関数の 1 つ (上記の launchSGPage のように) を特定のボタンで実行されるスクリプトにしたい場合です。これ:

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

self.launchSGPage() でエラーが発生します。なんらかの理由で、このコンテキストでは自己が機能しません。これを機能させる唯一の方法は、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 に答える