ウインドウの作り方
Python における GUI と簡単なウインドウ
Maya におけるウインドウやメニューなどの GUI は MEL スクリプトによって作られていますが、
Python スクリプトによっても GUI のカスタマイズ・独自メニューの作成ができるようになります。
これから、 Python 関数や自作の関数を操作するオリジナル GUI を作ってゆきましょう。
今回は簡単なスクリプトなので、プロシージャを宣言しないで で読み込むと、すぐに実行できるように関数をそのまま並べて作ってゆきます。
以下のスクリプトは スクリプト エディタ のメニュー で読み込んで実行してください。
ウインドウの作り方
ウインドウを作るには pm.window() 関数を使用します。
ただし、ウインドウを実際に表示するためには、pm.window() 関数に visible=True をつけて実行するか、この関数の後で pm.showWindow() 関数を実行しますが、
ここではwith文で表示する方法を使います。
- 何もないウインドウを表示します。
window1.py に以下の関数を書き込んで、スクリプト エディタ から読み込み実行させます。
import pymel.core as pm
with pm.window(title='window1'):
pass
スクリプトの解説
import pymel.core as pm
- pymel.core モジュールをインポートしてpmという名前で使用できるようにします。
-
with pm.window(title='window1'):
- ウインドウバーに window1 というタイトルが表示されたウインドウを作成します。
window() 関数も sphere() 関数などと同じく作られたオブジェクト(ウインドウ)の名前を返します。
このスクリプトでは返されたウインドウの名前は使っていませんが、必要ならば変数に代入しておき、
後で使うこともできます。
なお、title の後ろの window1 はタイトルであってウインドウの名前ではないので注意してください。
-
pass
- ウインドウ内に何も表示しないので、何もしない命令passを書いておきます。
ボタンのついたウインドウ
ウインドウにボタンなどを配置してゆくには、レイアウトコマンドが必要です。
レイアウトコマンドとはコントロールと呼ばれる部品(ボタンやスライダーなど)をどのような方法で並べるかを決めるためのものです。
レイアウトコマンドには他にも様々な種類がありますが、
上から順番に並べてゆくだけなら以下のように pm.columnLayout() を使用します。
- ボタンが1個ついたウインドウ
window2.py に以下の関数を書き込んで、スクリプト エディタ から読み込み実行させます。
import pymel.core as pm
with pm.window(title='window2'):
with pm.columnLayout():
pm.button()
スクリプトの解説
import pymel.core
- pymel.core モジュールをインポートします。
-
with pm.window(title='window2'):
- ウインドウバーに window2 というタイトルが表示されたウインドウを作成します。
この命令以下がウインドウの中身になります。
-
with pm.columnLayout():
- レイアウトを作成します。
GUI の部品をウインドウに配置してゆく時にはレイアウトが必ず必要です。
この命令の後に配置される GUI の部品(ここでは pm.button())は縦1列に並べられます。
-
pm.button()
- ボタンを 1 つ作ります。
ここではボタンを押した時に実行する関数を割り当てていないので押しても何も実行されません。
ボタン上のラベルには、何も指定されていなければ button1 などのボタンの名前が表示されます。
ボタンに関数を割り当てる
ボタンが押された時などに特定の関数を実行させるためには command フラグを使用します。
- 押されたら球体を作るボタンのついたウインドウ
window3.py に以下の関数を書き込んで、スクリプト エディタ から読み込み実行させます。
import pymel.core as pm
with pm.window(title='window3'):
with pm.columnLayout():
pm.button(label='sphere', command=pm.Callback(pm.sphere))
スクリプトの解説
import pymel.core as pm
- pymel.core モジュールをインポートしてpmという名前で使用できるようにします。
-
with pm.window(title='window3'):
- ウインドウバーに window3 というタイトルが表示されたウインドウを作成します。
この命令以下がウインドウの中身になります。
-
with pm.columnLayout():
- レイアウトを作成します。
この命令の後に配置される GUI の部品(ここでは pm.button())は縦1列に並べられます。
-
pm.button(label='sphere', command='pm.sphere()')
- ボタンを1つ作ります。
このボタンを押すと command の後にある文字列(' から次の ' まで)を実行します。
ここでは pm.sphere() 関数が実行されて NURBS の球体が作られます。
command の後では Python 関数だけでなく自分で作った関数も実行できます。
また、2つ以上の複数の関数を実行することもできます。
(下の練習問題を参照してください)
labelの後にある文字列 'sphere' がボタンの上に表示されるラベルになります。
練習
- window4.py を作り、下図のようにボタンを 3 つ並べて、それぞれのボタンで違う NURBS プリミティブを作るようにしてみましょう。
上から順番に NURBS の球、コーン、キューブを作るボタンを配置してください。
sphere ボタンを押した結果
cone ボタンを押した結果
cube ボタンを押した結果
(ヒント)
キューブは nurbsCube 関数で作ることができます。
- window4.py を参考にして window5.py を作り、ボタンを押すと X、Y、Z 方向に 2 倍にスケールされたプリミティブが作られるようにしてみましょう。
sphere ボタンを押した結果
cone ボタンを押した結果
cube ボタンを押した結果
(ヒント)
ボタンが押された時に 2 つ以上の関数を実行するには各関数を ; (セミコロン)で区切って並べます。
まとめ
- ウインドウを作るには window() 関数を使用します。
- ウインドウに部品を配置するにはレイアウトが必要です。
- ボタンが押された時に関数を実行するには command='Python 関数'を使います。
Python 関数の部分では ; で区切って複数の関数も実行できます。
参考
- レイアウト
columnLayout以外のレイアウトの紹介。
- Maya
Maya, MEL 関係(Tips, FAQ, コマンド)のページ
- リファレンス
Prev | Next
Home | Contents
Mail