2011/10/27

PyQt : 常に手前に、always on top

PyQtウィンドウを、DCCソフトなどで開いて、操作している最中に、DCCソフトをフォーカスしてしまうと、背面に隠れてしまいます。

その場合、ウィンドウを「常に手前に」モードで起動して解消させます。
サンプルは、こちら。



WindowStaysOnTopHintのマニュアルにたどりつけませんでした・・・。
隠れすぎです。
Qt Designerにもそれらしきものは見当たらず。

次に、モードをトグルする場合、モードが変わったらウィンドウを再表示させないといけないみたいです。
トグルをチェックボックスで切り替えるサンプルはこちら。



alwaysOnTopStateメソッドの最後に、show()を実行して、再表示させてます。

Softimageで実行する場合、PyQtForSoftimageというプラグインを作成されている方が居ますので、そちらを使えば、Softimageにインタフェース内でQtウィンドウを使用出来ます。
これで、裏に隠れません。

プラグインダウンロード
https://github.com/caron/PyQtForSoftimage

Softimage Mailng List Archive - PyQt for Softimage Thread
http://groups.google.com/group/xsi_list/browse_frm/thread/862d4f8fb4325010

2012で試したんですが、アドオンをインストールした時点で、エラーで止まってしまうので、ちょっと書き換えました。
コードの半分チョイ下辺りです。

qtevents.py


イベント系の定数が認識しないみたいです。
とはいえ、この辺りは、余程の事が無いと使わないので、全てコメントアウトしても問題無いかな?

使うには、基本の構文ではダメで、一緒にインストールされた、pyqt_example.pyを見れば、使い方が分かります。

Steven Caronさん凄い!

2011/10/22

PyQtでラーメンタイマー

ラーメンタイマー
PyQtでラーメンタイマーを作ってみました。

ラーメンタイマーとは、お湯を入れてラーメンが出来るまでの3分を計るものです。
動画がジャスト3分の物もそう言いますが、今回はきっちり3分計るものです。


参考にさせていただいたのは、こちらです。

PyQtではじめるGUIプログラミング

というか、ほぼおんぶに抱っこ。人の褌で相撲を取るってやつです。感謝いたします。どうもありがとう!

このままやるだけだとちょっとつまらないので、PyQtにせっかく入っている初級者用と見せかけて実は上級者用らしいQt Designerを使ってやってみたいと思います(◉◞౪◟◉`)ニコッ


Qt Desinerを起動
インストールされた、PyQtから、Designerを選びます。











フォーム選択ダイアログ
立ち上がったら、フォーム選択ダイアログが出るので、templates\forms の、Main Window を選択して、作成ボタンを押します。












メニューバーとステータスバーを削除
今回は使用しないので、メニューバーとステータスバーを削除しておきます。
右クリックで、コンテキストメニューが出ますので、それぞれを削除です。









UIの配置
次に、UI部分の配置をします。

一番上に、LCD Numberを配置。

二番目に、Grid Layoutを配置してから

三番目に、Push Buttonを、Grid Layoutの中に4つ放り込みます。
放り込み方が難しいかもしれませんが、1つボタンを放り込んだあと、さらに新しいボタンをLayoutの右端に置くと、青い縦ラインが出るので、そのままドロップすると、横並びになります。
下のほうに入れ込むと、下部分に青い横ラインが出るので、その場所にドロップです。


縦に整列
全て配置し終わったら、UIを綺麗に整頓します。

MainWindowをクリックして、選択をMainWindowにします。
ボタンなどのUIが無いところで、何も選択されていない状態で右クリックして、コンテキストメニューを開きます。
ちょっとここポイントです!

右クリック → レイアウト → 垂直に並べる

を選択します。


整列しました
うまくいけば、右図のような配置になります。

失敗しても根性です。

ウィンドウの右下端をドラッグしても、レイアウトがキープされているのが分かります。







ボタン名とオブジェクト名を変更
ボタン名とオブジェクト名を変更します。
右側のオブジェクトインスペクタにあるpushButtonを選ぶと、対応して選択されるので、見ながら変更していってください。
オブジェクト名は、後々スクリプト編集するときに使うので、覚えておいてください。





シグナル/スロットの設定
次は、ボタンの挙動を作るために、シグナル/スロットを設定します。
右図の手順で、STARTボタンにシグナル/スロットの設定をします。






シグナル/スロットの設定その2
右下にある、シグナル/スロットエディタで、項目を増やしボタンとスロットを設定します。
ダブルクリックで、プルダウンが出るので、選んでください。
全てのボタンに対して行ってください。

ここまでくれば、UIは完成。

ramen_timer.ui

で保存します。

ここまでは、簡単に誰でも作れますね(☉౪ ⊙)プギャー!!!!

後は、タイマーの設定、ボタンを押したときの挙動をスクリプト編集で、実装していきます。
(Qt Designerって、スロットのコード編集って出来ないですよね?知ってる方いらっしゃいましたら教えてください。)

Shift+右クリックからコマンドウィンドウを起動
Qt Designerから作られたファイルは、uiファイルです。
これをpyファイルに変換します。
先ほど作成したuiファイルのフォルダで、Shift+右クリックからコマンドウィンドウを起動します。




コマンドプロンプトで、次のコマンドを実行して、uiからpyに変換します。

pyuic4 -i 0 -x ramen_timer.ui -o ramen_timer.py

オプションの -i は、インデントのスペースの数を表しています。0にするとインデントがタブになるので、これが嫌な方は、無くてもOKです。
SoftimageのScript Editorは、インデントがタブになってしまうので、そっちで編集する方はつけたほうがいいでしょう。

出来上がったコードは、こんな感じ。



次に、__init__メソッドを追加します。
Ui_MainWindowクラスに、countというアトリビュートを加えます。
このcountの値を減らしてカウントダウンさせます。



そのあと、QTimerオブジェクトを入れ込みます。
setupUiの一番上に追加します。
後述しますが、時間が来たらLCDNumberの値を減らすメソッドを実行させるためです。
今回は、180.00で表示させようと思うので、10msで0.01カウント減らします。
ですので、setIntervalに10を入れ、インターバルが経過したら、カウントを0.01減らすといった内容です。



次に、LCDNumberの値を初期値180.00を表示されるメソッドを書き込みます。
このメソッドは、後述します。
書く場所は、setupUiメソッドの一番下です。



準備が出来たので、シグナル/スロットのメソッドを書き加えます。
全部で5つあります。



update_display
LCDNumberにカウント表示させます。
countの値に100を割って、その値をアップデートです。

do_countdown
countの値を1減らして、update_displayします。
countの値が0以下なったら、stop_countdownを呼びます。

start_countdown
countが0より大きかったら、QTimerをスタートさせます。

stop_countdown
QTimerをストップします。
これによって、カウントが減らなくなります。

reset_countdown
QTimerをストップすると共に、countの値を18000にします。
あとで、100割るためです。
その後、update_displayで、表示を元に戻します。

ここまで来ればほぼ完璧です。pyファイルを単体でつつけば、ラーメンタイマーの完成!
しかし、Softimageで動かすことを考えると、もう少し編集が必要です。
まず、1行目の

# -*- coding: utf-8 -*-

を削除します。
その後、一番下のほうにある

if __name__ == "__main__":

を削除して、そこから下のインデントを揃えます。
最後に一番下の

sys.exit(app.exec_())



app.exec_()

に変更です!

これで、全ての機能が入りました!!!!
編集したコードは、こんな感じです。



おめでとうございます!
これで、PyQtラーメンタイマーチュートリアルは終了となります。
長々とありがとうございました。

このコードをScript Editorや、Script Libraryから実行して、完璧にうまいラーメン作ってみてくださいね~(´☣౪☣)ハフー



2011/10/19

PyQtをインストール

mayaで、標準搭載されているQtをいいなーと突っ込んでいる指を口からキーボードに移してみました。

SoftimageのPythonのインストールからちょっと書いてみます。
Softimage本体に梱包されているPythonではなく、別にインストールしたPythonを使用することにします。
PyQtを、Softimageにコピーしてもいいのですが、なんとなく気持ち悪いので、ちゃんとインストールされたものを見に行きます。

Softimage2012にインストールしてあるPythonのバージョンは、2.6.4ですが今回使用したのは、2系の最新、2.7.2を使用しています。

本家からPythonをDownloadします。
http://www.python.org/download/


Softimage で Python ActiveX を実行するには、Mark Hammond の Python 用スクリプト拡張が必要です。http://www.python.org/download/windows/

上記のスクリプト拡張は、2011/10/19現在、Build216が最新です。
2.7用の64bit版を使いました。
http://sourceforge.net/projects/pywin32/files/pywin32/Build216/


PyQtをDownloadします。
http://www.riverbankcomputing.co.uk/software/pyqt/download

Downloadするのは、Source Packagesではなく、ちょっと下にあるBinary Packagesのほうです。
今回は、こちらを使用しました。
PyQt-Py2.7-x64-gpl-4.8.5-1.exe Windows 64 bit installer


Softimageのモジュールが2012から追加されたので、siutils.pyをPython2.7.2へ追加します。
以下は、サブスクリプションアドバンスドパックから引っこ抜いた例です。

C:\Program Files\Autodesk\Softimage 2012.SAP\Application\bin\siutils.py

このファイルを

C:\Python27\Lib\site-packages

へコピーします。

最後に、環境変数をセットします。
Windows7の場合
エクスプローラからコンピュータを右クリック → システムの詳細設定 → 環境変数

Path
C:\Python27
C:\Python27\Lib\site-packages\PyQt4
PYTHONPATH
C:\Python27\Lib\site-packages

これらをそれぞれセットします。

ここまで出来たら、PyQtのセットアップは完了です。
サンプルを実行して動作するかどうかテストしてみてください。



PyQtウィジェットが動作したら、テキストボックスに何か文字を入力してボタンを押すと、Script Editorに、文字が表示されます。

さて、いろいろいじってみようかな~。
みなさんもいじってみてくださいね~。


Perforce: 複数のワークスペースを更新するバッチ

batを叩けば全部更新。 @echo off set P4PORT=x.x.x.x:xxxx set P4USER=user set P4PASSWD=password echo %P4PORT% echo %P4USER% echo %P4PASSWD% echo %P4PAS...