2013-10-16 68 views
1

因此,第一部分對代碼無關緊要,但對於任何知道它的人來說,我都會在The Foundry的'Nuke 」。創建一個pythonPanel GUI。在Python類中使用self(在Nuke製作GUI中)

所以,當我創建我的面板,它開始:

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

隨着初始化(個體經營):部分。

當我增加旋鈕,或UI控件,該面板,我用sometihng這樣的:

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) 

而且使用的自我,它的偉大工程。

我的問題是,在我第一步中,當我添加旋鈕(就像我創建的字符串旋鈕一樣),我想讓我的一個函數(如上面的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()') 

這適用於所有意圖和目的,但似乎只是......骯髒和不潔的給我。我不確定是什麼,但有些東西告訴我這有什麼問題。任何人都可以爲我清除一個更好的方式來鏈接到這個類中的函數,而不是全局變量名嗎?

回答

0

當按鈕被點擊時,你的面板的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) 
0

使用self會給您一個錯誤,因爲您將此腳本作爲字符串提供。它是在一個不同的詞彙環境中進行評估的,即使有自我約束的東西,它也不是「你」的自我,你想要使用它。

我明白爲什麼使用這樣的全局變量會讓你感覺噁心。我會有同樣的。你基本上有兩種選擇:

  • 試圖通過一個lambda作爲第三個參數來PyScript_Knob構造,像這樣:

    self.sgpage = nuke.PyScript_Knob('sgpage', 'Open SG page', lambda: self.launchSGPage()) 
    
  • 如果不工作(我還沒有與核武器工作,所以我不知道他們是否支持這一點),看看這裏提供的文檔:http://docs.thefoundry.co.uk/nuke/63/pythonreference/nuke.PyScript_Knob-class.html,我只會寫我自己的Script_Knob的子類,這將允許採取這樣的lambda。我想你只需要覆蓋構造函數,並使用​​方法來使其工作。優先分數爲command()setCommand()

+0

不幸的是lambda沒有工作。可怕的是,就我所瞭解的python而言,我以某種方式設法跳過了(甚至所有我參考的腳本,從來都沒有出現過)lambda。我查了一下,但你能澄清它的作用嗎? 編寫一個PyScript_Knob的子類可以工作 - 儘管如此,我還是有一段時間。謝謝你爲什麼要自我清理。在這種情況下沒有工作。我沒有想到將它作爲字符串處理的事實將它運行在覈主環境中,而不是在我的班級中。 – aescript

+0

Lambda只是創建一個匿名函數。運行'lambda:self.launchSGPage()'的結果是一個函數對象,它是一個不帶參數的函數,調用時調用'self.launchSGPage()'。你可以把它分配給一個變量,比如f,然後調用'f()'。 –

相關問題