1

だから私はこれが少し回避策であり、おそらくこれを行うためのより良い方法があることを知っていますが、ここに取引があります。この情報を収集する場所からコードを簡略化し、確かな値を与えました。

curSel = nuke.selectedNodes()
knobToChange = "label"
codeIn = "[value in]"

kcPrefix = "x"
kcStart = "['"
kcEnd = "']"

changerString = kcPrefix+kcStart+knobToChange+kcEnd


for x in curSel:
    changerString.setValue(codeIn)

しかし、私が考えたエラーが発生します。これは、文字列に属性「setValue」がないことです。

これは、changerStringの代わりにx ['label']と入力するだけで機能するためですが、changer文字列がまったく同じことを言っていても、コードではなく文字列として読み取られます。

何か案は?

4

2 に答える 2

5

現在の名前空間に基づいて文字列をPythonオブジェクトに評価するための何かを探しているようです。globalsそのための1つの方法は、辞書を使用することです。

globals()['x']['label'].setValue(...)

つまり、globals()['x']['label']と同じですx['label']

または、あなたのケースのためにそれを明確に説明するために:

globals()[kcPrefix][knobToChange].setValue(codeIn)

他の人が提案するかもしれませんeval

eval('x["label"]').setValue(...)  #insecure and inefficient

しかし、globalsここでは間違いなくより良いアイデアです。


最後に、通常、このようなことをしたい場合は、最初に辞書または他の種類のデータ構造を使用して、データをより整理された状態に保つことをお勧めします。

于 2013-01-07T16:06:10.377 に答える
2

右、あなたが反抗している2つのことがあります。まず、文字列に対してsetValue()呼び出しを実行しようとしている元のコードでは、正しく機能しません。理想的には、2つの呼び出しのいずれか(x.knob('name_of_the_knob')またはx['name_of_the_knob']、プロジェクト/施設/個人のスタイルと一致する方)を使用して、ノブオブジェクトの値を取得および設定します。

コメントから、あなたのコードは次のようになります(私のコメントは、Nukeにそれほど精通していない他の人々のために追加されました):

# select all the nodes
curSel = nuke.selectedNodes() 

# nuke.thisNode() returns the script's context 
# i.e. the node from which the script was invoked
knobToChange = nuke.thisNode()['knobname'].getValue() 
codeIn = nuke.thisNode()['codeinput'].getValue() 

for x in curSel: 
    x.knob(knobToChange).setValue(codeIn) 

このサンプルUIを使用して、示されている2つのフィールドの値と、スクリプトを起動するボタンを使用します。

関連するボタンを備えたサンプルUI

...このコードを実行すると、「foo」という名前はありません」というエラーメッセージが表示されます。これは、呼び出しが実際にノブの評価結果.getValue()を返しているためです。これは、実行しようとしたときのエラーメッセージです。 TCL [value foo]であり、fooという名前のオブジェクトがないことを検出します。

.toScript()理想的には、生のテキストを返すinvokeを実行するのが理想的です。

# select all the nodes
curSel = nuke.selectedNodes() 

# nuke.thisNode() returns the script's context 
# i.e. the node from which the script was invoked
knobToChange = nuke.thisNode()['knobname'].toScript() 
codeIn = nuke.thisNode()['codeinput'].toScript() 

for x in curSel: 
    x.knob(knobToChange).setValue(codeIn) 

元のコードに従って文字列を作成したり、角かっこを追加したりすることで、この問題を回避できますが、そうです、それは苦痛であり、メンテナンスの悪夢であり、オブジェクトを構築するそのルートをたどり始めます文字列から(@mgilsonがaglobals()またはeval()メソッドの両方で行う方法を説明しています)


Nukeを使用する喜びがなかった人のために、より多くのコンテキストを提供する(または提供しない)小さなスクリーンショットを次に示します。

ノードグラフとプロパティダイアログボックスを示すNukeのサンプルscreenie

于 2013-01-07T16:23:34.220 に答える