Maya GUI 対決 – MEL vs Python vs PySide
ハローワールド!プログラマのマツノブです
皆さんMayaのプラグインを作る上で何に悩みますか?
そうGUIですね!
今回はMayaスクリプトでGUIを実装する方法についてお話しようと思います。
今回の例題としてコンソールに「Hello!」と表示するボタンを配置したウインドウを作ります。
MELの場合
// Windowの生成
$window = `window -title "Hello Button" -widthHeight 100 50`;
// レイアウトの選択
columnLayout -adjustableColumn true;
// ボタンの生成
button -label "Hello" -command "print(\"Hello!\")";
// columnLayout の有効範囲の終わり
setParent ..;
// ウインドウの表示
showWindow $window;
Mayaの標準スクリプトであるMelで実装する場合、このようなコードになります。
Pythonの場合
# maya.cmds モジュールのインポート
import maya.cmds as mc
# Windowの生成
window = mc.window(title='Hello Button', widthHeight=(100,50))
# レイアウトの選択
mc.columnLayout(adjustableColumn=True)
# ボタンの生成
mc.button(label='Hello', command='print("Hello!")');
# columnLayout の有効範囲の終わり
mc.setParent('..')
# ウインドウの表示
mc.showWindow(window)
構文こそPythonのものになっていますがMELの場合とほとんど変化はありません。
PySideの場合
PySide自体に馴染みがない人もいると思いますので軽く説明をすると、PythonのGUIライブラリでQtのPythonバインディングです。
注意:MayaのPySideはMayaのバージョンによって、PySideまたはPySide2の違いがあります。
今回はMaya2018でPySide2を使うやり方を紹介します。
designer を使用したレイアウト
標準のインストール先にインストールしている場合
C:\Program Files\Autodesk\Maya2018\bin\designer.exe にレイアウトツールがあります。
このツールを使用してGUIのレイアウトを行います。
*.ui ファイルを *.py に変換
レイアウトツールで作成した *.ui ファイルをPythonで使いやすいように *.py に変換します。
コマンドプロンプトで下記のようなコマンドを実行することで、*.uiから*.pyファイルを得ることができます。
set WORK_SPACE=作業ディレクトリ
cd C:\Program Files\Autodesk\Maya2018\bin\
mayapy pyside2-uic -o %WORK_SPACE%\hello_button_ui.py %WORK_SPACE%\hello_button.ui
MayaでPythonコマンドを実行する
import maya.cmds as mc
# PySide2のモジュールをインポート
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
import shiboken2 as shiboken
import maya.OpenMayaUI as OpenMayaUI
# *.ui から作成した *.py をインポート
# *.pyのあるディレクトリにパスが通っている必要がある
import hello_button_ui as qtGUI ;reload(qtGUI)
class GUI(QMainWindow):
ptr = OpenMayaUI.MQtUtil.mainWindow()
parent = shiboken.wrapInstance(long(ptr), QWidget)
def __init__(self,parent=None):
super(GUI, self).__init__(self.parent)
self.ui = qtGUI.Ui_MainWindow()
self.ui.setupUi(self)
# ボタンにHello!と表示するコマンドを登録
self.ui.pushButton.clicked.connect(self.Hello)
def Hello(self):
print 'Hello!'
def main():
global helloGUI
try:helloGUI.close()
except:pass
app = QApplication.instance()
helloGUI = GUI()
helloGUI.show()
app.exec_()
main()
まとめ
PySideは実行に必要な手順が多く使えないように見えますが、複雑なGUIを組む上でレイアウトツールが利用できるのは大きなメリットです。
少ないパーツで構成されたGUIはMEL/Python
複雑な構成のGUIはPySideと使い分けることで、より良いGUI開発ができるのではないでしょうか?
それでは今回はここまで