こんにちは!Rhinoです。
早くも何を書こうか悩んでます。我ながら底が浅くて困ったもんです(;´д`)トホホ
今日はMayaのPythonでウィンドウを作ってみたいと思います。
どんなScriptを書くにせよやっぱりウィンドウが基盤になりますよね。
ただ、経験上一番つまづき安い箇所なのかもしれません。
なので、凄くシンプルなウィンドウ作りから始めてみようと思います。
今日ご紹介するのは僕がいつも使っているテンプレートです。
# -*- coding: utf-8 -*-
import maya.cmds as cmds
def createGUI( *args ):
if cmds.window( 'myWindow', exists=True ):
cmds.deleteUI( 'myWindow', window=True )
winMyWindow = cmds.window( 'myWindow', title='My Window' )
cmds.columnLayout( )
#ここにボタンなどを配置していく
cmds.setParent( '..' )
cmds.showWindow( winMyWindow )
def main():
createGUI()
if __name__ == '__main__':
main()
解説
どう動いているのか?
今回の大まかな流れはこうなっています。
まずはmain関数から実行され、main関数がウィンドウなどのGUIを作成する為に作成したcreateGUI関数を呼び出して、その中でウィンドウなどの作成や表示を行っています。
main関数
最初にmain関数が実行されます。
ここではcreateGUIという関数を呼び出しているだけです。
def main():
createGUI()
createGUI関数
この関数は自作のものになります。
ウィンドウの作成に関する処理とまとめた関数になります。
中身を見ていきましょう。
既存ウィンドウの判定
ウィンドウを作成した際、既にウィンドウがある場合が考えられます。
そうすると、何個もウィンドウが作成されたり、既にあるので表示できないなどのエラーになることが想定されます。
その為、既にウィンドウがあるかとどうかを判定して、あったら古いウィンドウを削除するという処理をまず実行しています。
‘myWidnow’というのが今回作成するウィンドウを判別するための名前ですね。
いくつもウィンドウを作った場合、どれがどのウィンドウなのか区別できなくなってしまいますので、ウィンドウに固有の名前を付けておくのが良いと思います。
if cmds.window( 'myWindow', exists=True ):
cmds.deleteUI( 'myWindow', window=True )
ウィンドウの生成
いよいよウィンドウを生成します。と言っても1行だけなんですが…
ウィンドウの生成にはwindow関数を使います。
この関数を実行することでウィンドウが作られます。
‘myWindow’ | ウィンドウの固有の名前 |
title | ウィンドウのバーに表示されるタイトル名 |
生成したウィンドウはwinMyWindowという変数に格納しています。
この時点ではウィンドウは生成されたのですが、まだ表示はされていません。
ウィンドウの中にはボタンやフィールドなどを配置するかと思います。
すべてのレイアウトを作成してから、最後にまとめてウィンドウを表示します。
winMyWindow = cmds.window( 'myWindow', title='My Window' )
レイアウトの作成
作成したウィンドウにレイアウトを作成していきます。
今回はプレーンなウィンドウの作成ですので、columnLayoutのみになっています。
columnLayout | 縦一列に配置するレイアウト |
columnLayoutとsetParentで囲まれた部分が縦に配置する1つのレイアウトとなります。
ボタンなどを作成していく場合はこの間に記述していきます。
cmds.columnLayout( )
#ここにボタンなどを配置していく
cmds.setParent( '..' )
ウィンドウの表示
レイアウトなどウィンドウの中身を作成し終わりましたら、最後にまとめてウィンドウを作成します。
ウィンドウの表示はshowWindow関数になります。
この関数に予め作っておいたウィンドウが格納されているwinMyWindow変数を渡してあげることで表示されますよ。
最後の2行は何?
ウィンドウの表示ができました!
では最後の2行は何なのでしょうか?
これはPythonのスクリプトファイルを他のプログラムから再利用することができるのですが、そのファイルのことをモジュールと言います。
このモジュール(今回の場合ですとmain())を直接実行した場合にのみ、実行したいのでこの2行を記述しています。
if __name__ == '__main__':
main()
どういう事なのかと言いますと、スクリプトファイルをインポートした場合にいきなり中身が実行されては困りますので、main関数を直接実行した場合にのみ動くようにするためにこの2行が必要なんですね。
スクリプトの使い方
では、どうやって使ったらいいのかと言いますと、まず書いて頂いたスクリプトを拡張子.pyで保存して下さい。
スクリプトエディタに次のように記述して下さい。
myWindowをインポートして、そのモジュールmain()を実行しますよという意味になります。
import myWindow
myWindow.main()
Enterキーまたは実行ボタンを押して実行してみて下さい。
ウィンドウが表示されましたか?
ちなみに、スクリプトの記述を編集して再度実行する場合はreload関数を使います。
reload( myWindow )
myWindow.main()
最後に
無事にウィンドウが表示されましたでしょうか?
ウィンドウを表示するだけでもいくつかの段階があって難しく感じてしまうかもしれませんが、慣れればきっと大丈夫ですよ。
ウィンドウだけでは味気ないので、次回はウィンドウの中身を作ってみたいですね。
では、また!
コメント