MotionBuilder2012のGUIはQtで作られてるのにスクリプトでPyQtが使えないっておかしくね?
2012/2/13
Tag: MotionBuilder,pyqt,python,qt,script,UI
PyQtとはクロスプラットフォームGUIツールキットのQtをPythonで使えるようにしたものです。似たようなものにPySideがあります。訳すと横乳ですね。なんか大きそうな感じです。PyQtは「パイキュート」と読むらしいです。なんか小さそうな感じです。
皆様こんにちは、尻派のikaです。
今回はMotionBuilder(以下MB)のスクリプトで小さい方(PyQt)の使い方を紹介します。
PyQtをインストール
MBのPythonのバージョンは2010が2.6.1、2011と2012が2.6.4なので、Python2.6用のPyQtをインストールします。
PyQtは以下のURLからダウンロード出来ます。
http://www.riverbankcomputing.co.uk/software/pyqt/download
もしかしたら、2010では最新バージョンは使えないかもしれません。PyQt4.5.3では動作確認出来ましたが、4.7では文字化けしたエラーが出て実行出来ませんでした。
2011と2012は両バージョンで動作確認出来ました。
MotionBuilderでPyQtを使う方法
二通りの方法があります。二つともPythonのサーチパスにPyQtのパスを追加するものです。PyQt以外(例えば自作のライブラリなど)もこの方法が使えます。
一つ目は、MotionBuilderのPythonのファイルを書き換える。必ずバックアップを取ってください。
(MBインストールフォルダ)/bin/config/Python/pyfbsdk_init.py
上のファイルから以下の記述を探します。
path.extend(sys.path) sys.path = path
それの前に一行追加します。
こんな感じ
path.append("C:/Python26/Lib/site-packages") path.extend(sys.path) sys.path = path
二つ目の方法は、実行コードにPyQtのパスを書き込む。
以下の三行をコードの頭に追加する。
import sys sPyQtPath = "C:/Python26/Lib/site-packages" if not sPyQtPath in sys.path : sys.path.append(sPyQtPath)
簡単なコードでPyQtを使えるようになったか確認します。
from PyQt4.QtGui import * w = QWidget() w.show()
何もないウインドウが表示されたら成功です。
QtDesigner
QtDesignerの詳しい使い方はtakさんの記事にあるので、今回はMBでの.uiファイルの使いかたです。
QtDesignerを起動します。
GUIの雛形を選びます。
通常はWidgetでいいと思います。メインメニューやステータスバーが欲しい場合はMainWindowを選択すれば良いと思います。
Signal/Slot Editorでシグナルとスロットを関連付ける。
FirstPyQt.uiという名前で保存します。
MBでスクリプトを書きます。Window>Python Editor
FBSDKのモジュールをインポート
from pyfbsdk import *
PyQtのモジュールをインポート
from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.uic import loadUi
クラスを作る
class Main(QWidget) : def __init__(self) : QWidget.__init__(self) self.ui = loadUi("(保存した場所)/FirstPyQt.ui", self) self.ui.show()
widgetのclassアトリビュートに書いてあるクラスを継承します。
スロットをメソッドにしてクラスに追加
def onPushButton(self) : o = FBModelNull("null") o.Show = True
最後にクラスをインスタンス化
Main()
実行すると、ボタンが一つあるウインドウが開きます。ボタンを押すとヌルオブジェクトが追加されます。
エラーが出ていないのにうまく動かない場合はもう一度スクリプトを実行してみて下さい。前回のエラーやprintで出力したものが表示されます。
PyQtでスタンドアローンツール
ついでにPyQtでスタンドアローンのツールを作る方法も書いておきます。
先ほど作成した.uiファイルを使います。
import sys from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.uic import loadUi class Main(QWidget) : def __init__(self) : QWidget.__init__(self) self.ui = loadUi("(保存した場所)/FirstPyQt.ui", self) self.ui.show() def onPushButton(self) : print "Pushed" app = QApplication(sys.argv) Main() sys.exit(app.exec_())
MB版との違いはpyfbsdkモジュールが無いのと、最後に何やら増えてるところです。
(pyfbsdkモジュールが無くなったので、onPushButtonメソッドの内容も変わってます。)
最後の三行はPyQtを使うときのお約束みたいなものなので、特に気にしなくていいと思います。
おまけ
サンプルダウンロード
(MBインストールディレクトリ)\bin\config\Scripts にファイルをコピーしてから使用して下さい。
TechTalk2012_MBPyQt.ui | QtDesignerで作成したUIファイル |
TechTalk2012_MBPyQt.py |
MB用スクリプト PyQtを「C:\Python26」、MBを「C:\Program Files\Autodesk\MotionBuilder 2012」にインストールされていることを前提にしてあります。 sPyQtPah(11行目)、sUiPath(18行目) を自分の環境にあわせてフルパスで書き換えて下さい。 |
TechTalk2012_PyQt.py |
スタンドアローン版 うまく動かない場合は、sUiPath(13行目) を自分の環境にあわせてフルパスで書き換えてみて下さい。 |
コメント
コメントフォーム