株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • MotionBuilder2012のGUIはQtで作られてるのにスクリプトでPyQtが使えないっておかしくね?

MotionBuilder2012のGUIはQtで作られてるのにスクリプトでPyQtが使えないっておかしくね?

2012/2/13

Tag: ,,,,,

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を選択すれば良いと思います。

PushButtonを一つ追加。

シグナルとスロットの追加

スロットにonPushButton()を追加。

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()

継承元は.uiファイルをテキストエディタで開いて確認

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行目) を自分の環境にあわせてフルパスで書き換えてみて下さい。

PyQtリファレンスガイド

Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*