-2

私がしようとしているのは、辞書に項目を追加し、必要に応じて2番目のボタンを入力することだけです!!! 青い再生ボタンをクリックして Maya スクリプト エディタからコードを実行すると、すべてうまくいきますが、このスクリプトをインポートすると funtest funtest.main() をインポートします

ウィンドウは正常に読み込まれますが、いずれかのボタンをクリックするとエラーが発生します...スクリプトエディターからのコードの実行とインポートによる他のコードの実行の違いはなぜですか..

それは同じである必要がありますか、それが私の論理の何が問題なのですか?

import maya.cmds as cmds
dic={}
print("dictionary is empty",dic)
def main():
    inst=btnUI()
    inst.create()


class btnUI(object):
    def __init__(self, winName="winTheWindow"):
        self.winTitle = "The Window"
        self.winName = winName

    def create(self):
        if cmds.window(self.winName, exists=True):
            cmds.deleteUI(self.winName)
        dic['item1']='item1value'
        dic['item2']='item2value'

        cmds.window(self.winName, title=self.winTitle)
        self.mainCol = cmds.columnLayout( adjustableColumn=True )
        self.btnA = cmds.button( label='Press Me - External Func',c='outsideFunc(dic)' )
        self.btnb = cmds.button( label='Populate more items',c='populateDic()' )
        cmds.showWindow( self.winName )
        cmds.window(self.winName, edit=True, widthHeight=[250,75])



def populateDic():
    dic['item3']='item3value'
    dic['item4']='item4value'
    dic['item5']='item5value'

def outsideFunc(dicItems):
    print("Outside function, called from inside a class function")
    print(dicItems)

if __name__ == '__main__':
    main()
4

1 に答える 1

0

これは、c引数の解決がcmds.button()別の名前空間で行われているためです。それを解決するにはいくつかの方法があるようですが、より Pythonic な方法に従うことをお勧めします。

from functools import partial
self.btnA = cmds.button( label='Press Me - External Func',
                         c=partial(outsideFunc, dic))
self.btnb = cmds.button( label='Populate more items',c=populateDic)

ボタン A については、へのpartial受け渡しを支援するために を使用してdicいるoutsideFuncため、partial によって生成される結果の関数は引数を必要としません (引数が事前に読み込まれていdicます)。

ボタン B の場合は、引数を取らないため、これは不要です。そのため、呼び出す関数の名前を指定するだけです。引用符がないことに注意してください。Python はこれを正しい名前空間で解決し、期待どおりに動作します。

ところで、このページは役立つようで、コマンド コールバックについて説明しています: http://www.luma-pictures.com/tools/pymel/docs/1.0/ui.html

更新: ボタンはコールバックに引数を渡すため、それをラップする必要があります。

from functools import partial
self.btnA = cmds.button( label='Press Me - External Func',
                         c=lambda arg: outsideFunc(dic))
self.btnb = cmds.button( label='Populate more items',c=lambda arg: populateDic())

これにより、引数を破棄する匿名関数がいくつか作成されます (必要ないため)。

于 2012-09-15T10:50:09.223 に答える