[Python] MayaのGUIからのコールバック(書いた後に間違いと判明。正直、すまんかった。)

タイトルの通りなので、それを踏まえたうえで読むようにしてください。 
一切責任は持たん!
てそれはこの記事に限ったことではないんですが:P

—————————————————————————大馬鹿野郎のささやきはここから↓↓

意味ねぇぇぇぇぇぇぇぇぇぇと思っていたものに対して、まぁこういう使い方もあるか・・・と思ったのでメモ。


たとえばウィンドウを作ってて、ボタンなんかに関数オブジェクトを割り当てます。

cmds.button(l="OK", c=hoge)

割り当てた関数hogeの宣言ですが、僕は大体こんな感じにします。

def hoge(*args):
  print("hoge");

*argsじゃなくてもいいんですが、普通に呼ぶこともあったりするわけです。
hoge()という具合いで。
そういう場合ここを可変長引数にしておくほうが何かと便利なのです。

でもそもそもこの場合の*argsは一体なんなんだと。
何も情報入って無いくせに何やっとんじゃこいつは!邪魔くせぇ!!と思って完全に無視してました。
一応*argsでキャッチするんだけど使わない、まぁMayaのGUIからコールバックさせるときのおまじない、みたいなイメージで。

それが嫌になってコールバックの際はlambdaを多用するようになった時期がありました。

cmds.button(l="OK", c=lambda *args:hoge())

これだとhogeの宣言に*argsがいらなくなってスッキリします。

でも、また最近直接オブジェクトを渡すようになってきました。
直接渡す&クロージャで渡す、が多いですね。lambdaはホントにたまに使う感じです。

で、そうなるとやっぱり*argsがうぜぇとも思ってたんですが、今日それに使い道を発見しました。
これは人それぞれのスタイルによってもまた有用性は違うと思うのですが、
上で述べたとおり、僕はコールバック用の関数をたまに普通に処理の最中に呼ぶことがあります。
そういう場合、コールバックから呼ばれたのか処理の最中に呼ばれたのかが知りたくなります。
というか、なりました。
そういう状況を意識したの自体今日が初めてなので実際にはどうかわからんのですが:P

ここでやっと*argsの使い道です。(前フリ長くてすみません。)

callbackで呼ばれた場合、*argsには、何かが入ります。
何かとは何か。調べたところunicodeの文字列っぽかったです。
でも意味はないっぽいです。
とにかく、何かが入る。
てことはlen(args)>0ってことです。
なのでそれを使えば呼び出し先がどこからなのか、大体判断出来、処理の分岐が可能、ということです。
1個の関数で2度おいしい。的な。
そういう感じで。
 
 
 
 
 
 
と思ってここまで書いてアレなんですが、args[0]に値入っちゃってるよ・・・
超有用な値入っちゃってたよ・・・
思わず悲鳴を上げてしまったよ僕は・・・

optionMenuGrpのchangeCommandに関数オブジェクトを登録して*argsに謎の引数を取得してたんですが、
新しく選択されたアイテムが入ってきてた。。。
つまり、a, b, c, d… というoptionMenuGrpがあったとします。
で、aを選んだときに呼ばれたコールバック関数の*argsは(‘a’, )となっていました。
・・・マジか。

・・・・・・。
 

あ!もしや!と思ってtextScrollListでも試してみたらこっちは何もはいらず。
なんなんだ・・・・。

つーか返すならコントロールの名前とか返せ!!
ゲリラ的に値とか返してんなバカ!
 

あれ、もしかして、、、なんか嫌な予感・・・
あ!やっぱり!!!
len(args)も0じゃん!!
なんだーーーーーーーーーーーーーーーーーーーーーーーーーーーー!!!!!!!!!
 
 
 
 
 
 
というわけでこのエントリーは全編に渡って意味がなくなりました。
大変申し訳ない。

自戒のため、このままにしておきます。。。
 
o….. .. . . .  .    .      rz

「[Python] MayaのGUIからのコールバック(書いた後に間違いと判明。正直、すまんかった。)」への4件のフィードバック

  1. あのMayaが渡してくる値って本当にいい加減ですよね。Noneだったり、値が入ってたり、渡してこなかったり・・・
    textScrollListのselectCommandが何も渡してこなかったときには、渡すのか渡さないのかどっちかに統一してくれー!!ってなりました。
    自分はlambda使いまくりです。

  2. >inagakiさん
    そう!本当にそう思います!
    どんだけいい加減なのかと!小一時間!!
    おかげでMayaにどっぷりな僕はwx使ったときも思わずeventを無視しそうになりましたよ!
    他のGUIToolkitでは随分ちゃんとイベント返してくれるのですごく書きやすいし助かります:)
    ってそれが普通かww

    > 自分はlambda使いまくりです。
    今回書いたのはクロージャの方がいろいろ都合が良かった、ってだけでした:P
    lambdaは便利です。
    無名ってのが萌えポイントです冗談です。

    あ、そういえばこの間mixiでお勧めしていただいたPyQt本を会社で買ってもらいました:)
    これから読み進めますが、実戦投入はもうちょい先、、、か・・・。

  3. changeCommandに引数付きのメソッドを投げたかったので調べていましたらこの記事が見つかりました。argsしか引数を受け取らなくて困っていたのですが、無名関数の使い方でピンときました。cc=lambda *args:hoge(transform, args[0])等で引数渡せるようになり、詰まっていたことが解決しました。
    5年前の記事ですが大変参考になりました。ありがとうございます。

  4. >grgsiberiaさん
    わざわざありがとうございます。
    お役に立てて何よりです!

コメントを残す

メールアドレスが公開されることはありません。