ご無沙汰しております。
最近めっきり更新をさぼっておりましたが、
仕事納めも済んだことだし、冬休み期間にまたいろいろ書けたらなと。
そんでネタ何にしよかなと思ったんですが、
今年やってたことを振り返ると、mayaをそんなにガツガツいじってないんですよ。
ほとんど、mayaの外で動かすpythonスクリプト作ってました。
あと無駄にUI作りこんだりして現実逃避したり。
あ、ネタあったぞ。これにしよう。
というわけで今回はPySideで遊びます。
最近めっきり更新をさぼっておりましたが、
仕事納めも済んだことだし、冬休み期間にまたいろいろ書けたらなと。
そんでネタ何にしよかなと思ったんですが、
今年やってたことを振り返ると、mayaをそんなにガツガツいじってないんですよ。
ほとんど、mayaの外で動かすpythonスクリプト作ってました。
あと無駄にUI作りこんだりして現実逃避したり。
あ、ネタあったぞ。これにしよう。
というわけで今回はPySideで遊びます。
●遊ぶ環境を整える
※これは個人で遊ぶのが目的ですので、会社の開発環境などには向かない場合があります
まずはpython本体とPySideをインストールしましょう!
両方のバージョンは合わせないとたぶんダメです。
(python2.7系ならPysideも2.7用を選んでください)
・python
・PySide
インストールができたらとりあえずシェルとかでインポート出来るかテストしてみましょう
両方のバージョンは合わせないとたぶんダメです。
(python2.7系ならPysideも2.7用を選んでください)
・python
・PySide
PySide -> Downloads | Qt Wiki | Qt Project
下のほうにOSごとのリンクがあります。
下のほうにOSごとのリンクがあります。
インストールができたらとりあえずシェルとかでインポート出来るかテストしてみましょう
import PySide
まぁ、何も出ないんですが。。
エラー出なければインポート出来てます
エラー出なければインポート出来てます
●QtDesinerでUI作るよ
UI構築をゼロからフルスクラッチとか大変なので、QtDesignerを使って作ります
この記事はあくまで気楽にやることが目的なので
Pythonインストールディレクトリ\Lib\site-packages\PySide\designer.exe
でQtDesignerを起動します
最初に出てくるウインドウで、Main Window か Widget を選択してください
Label で文字を、Push Button でOKボタンを、ほかには Spin Box や Progress Bar などを
ウインドウへドラッグしていけばさくっとUIが出来ます
右側にある Object Inspector にUIの部品のツリーがありますが
これを面倒ですがきちんと名前を付けておいてください
(あとでスクリプトを作るときに使います)
この記事はあくまで気楽にやることが目的なので
Pythonインストールディレクトリ\Lib\site-packages\PySide\designer.exe
でQtDesignerを起動します
最初に出てくるウインドウで、Main Window か Widget を選択してください
Label で文字を、Push Button でOKボタンを、ほかには Spin Box や Progress Bar などを
ウインドウへドラッグしていけばさくっとUIが出来ます
右側にある Object Inspector にUIの部品のツリーがありますが
これを面倒ですがきちんと名前を付けておいてください
(あとでスクリプトを作るときに使います)
形が出来たら、名前をつけてUIファイルを保存します
●UIファイルをスクリプトで読み込ませる
保存した .uiファイル と同じ場所に以下のようなスクリプトを作ります
大体いつもこれから始めます
大体いつもこれから始めます
# -*- coding: utf-8 -*-
import os
import sys
from PySide import QtCore, QtGui
from PySide.QtUiTools import QUiLoader
CURRENT_PATH = os.path.dirname(__file__)
#----------------------------------------------------------------------------
## GUIを作るクラス
class GUI(QtGui.QMainWindow):
def __init__(self, parent=None):
super(GUI, self).__init__(parent)
loader = QUiLoader()
uiFilePath = os.path.join(CURRENT_PATH, 'blogUI.ui')
self.UI = loader.load(uiFilePath)
self.setCentralWidget(self.UI)
#------------------------------------------------------------------------------
## GUIの起動
def main():
app = QtGui.QApplication(sys.argv)
ui = GUI()
ui.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
#-----------------------------------------------------------------------------
# EOF
#-----------------------------------------------------------------------------
■import部分
■GUIクラスの中でやってること
■main関数でやっていること
実行するとUIが表示されたでしょうか?
・from PySide import QtCore, QtGui
→ QtのUIを作るための基本的なモジュール
・from PySide.QtUiTools import QUiLoader
→ uiファイルを読み込むためのモジュール
・CURRENT_PATH = os.path.dirname(__file__)
→ スクリプト置き場のディレクトを取得しています
これにより、後で同じフォルダ内のuiファイルを読み込むという処理につなげます
→ QtのUIを作るための基本的なモジュール
・from PySide.QtUiTools import QUiLoader
→ uiファイルを読み込むためのモジュール
・CURRENT_PATH = os.path.dirname(__file__)
→ スクリプト置き場のディレクトを取得しています
これにより、後で同じフォルダ内のuiファイルを読み込むという処理につなげます
■GUIクラスの中でやってること
・super(GUI, self).__init__(parent)
→ QtGui.QMainWindow のクラスを継承して空のUIを作ります
・loader = QUiLoader() ~ self.UI = loader.load(uiFilePath)
→ ここでuiファイルを読み込んで構築しています
・self.setCentralWidget(self.UI)
→ 空のUIに読み込んで構築したUIを入れ込みます
→ QtGui.QMainWindow のクラスを継承して空のUIを作ります
・loader = QUiLoader() ~ self.UI = loader.load(uiFilePath)
→ ここでuiファイルを読み込んで構築しています
・self.setCentralWidget(self.UI)
→ 空のUIに読み込んで構築したUIを入れ込みます
■main関数でやっていること
・app = QtGui.QApplication(sys.argv)
→ アプリケーションオブジェクトを作成しています
・ui = GUI()
→ GUIクラスのインスタンスを作りUIを構築します
・ui.show()
→ UIを表示します
・sys.exit(app.exec_())
→ アプリケーションオブジェクトをメインループで動かすってことらしいです
→ アプリケーションオブジェクトを作成しています
・ui = GUI()
→ GUIクラスのインスタンスを作りUIを構築します
・ui.show()
→ UIを表示します
・sys.exit(app.exec_())
→ アプリケーションオブジェクトをメインループで動かすってことらしいです
実行するとUIが表示されたでしょうか?
●bat起動にしてみる
毎回シェルとかから実行するのめんどくさいじゃないですか
なので、batで起動できるようにします
なので、batで起動できるようにします
@echo off "C:\Python\Python27\python.exe" D:\python\blog_project\blogGUI.py pause
パスとかおもっきし出てますが、こんな感じに python.exe のパスと スクリプトパスを書きます
batを実行してさっきのUIが表示されれば成功です
batを実行してさっきのUIが表示されれば成功です
●アイコンを作る
なんでだよ、というツッコミは待ってくださいw

フォトショのシェイププリセットでさくっとそれなりに作成
抜きが必要な場合は、アルファ付きのレイヤーのまま32bitBMPで保存して、
拡張子を.icoに変更します
アイコンが出来たら、さっきのbatのショートカットを作り
名前の「.bat - ショートカット」の部分は消してしまいましょう
ショートカットのプロパティで アイコンの変更 で作ったアイコンを指定します
そしたらほら!
なんか普通のアプリケーションぽいじゃないですかw
こうしておくと面倒なビルドをしなくても、それっぽい感出てモチベーション上がります
ゴミ箱とコラボ
フォトショのシェイププリセットでさくっとそれなりに作成
抜きが必要な場合は、アルファ付きのレイヤーのまま32bitBMPで保存して、
拡張子を.icoに変更します
アイコンが出来たら、さっきのbatのショートカットを作り
名前の「.bat - ショートカット」の部分は消してしまいましょう
ショートカットのプロパティで アイコンの変更 で作ったアイコンを指定します
そしたらほら!
なんか普通のアプリケーションぽいじゃないですかw
こうしておくと面倒なビルドをしなくても、それっぽい感出てモチベーション上がります
●いい加減動作部分を作る
PySideのドキュメントはここにあるので参考にしながら、、
Overview — PySide v1.0.7 documentation
Overview — PySide v1.0.7 documentation
# -*- coding: utf-8 -*-
import os
import sys
import time
from PySide import QtCore, QtGui
from PySide.QtUiTools import QUiLoader
CURRENT_PATH = os.path.dirname(__file__)
#----------------------------------------------------------------------------
## GUIを作るクラス
class GUI(QtGui.QMainWindow):
def __init__(self, parent=None):
super(GUI, self).__init__(parent)
# uiファイルのロード
loader = QUiLoader()
uiFilePath = os.path.join(CURRENT_PATH, 'blogUI.ui')
self.UI = loader.load(uiFilePath)
self.setCentralWidget(self.UI)
# ウインドウのタイトルを指定
self.setWindowTitle(u'UIのサンプルだよ')
# ウインドウのサイズを指定
self.resize(256, 128)
# ウインドウのアイコンを設定
iconPath = os.path.join(CURRENT_PATH, 'icon.png')
icon = QtGui.QIcon(iconPath)
self.setWindowIcon(icon)
# UI要素にシグナルを追加
self.setSignals()
#----------------------------------------
## シグナルの登録
# @param None
# @return None
def setSignals(self):
# okボタンを押したときの動作
self.UI.ok_pushButton.clicked.connect(self.doIt)
#----------------------------------------
## スピンボックスの値を取得
# @param None
# @return < int >value : スピンボックスの値
def getSpinBoxNum(self):
value = self.UI.num_spinBox.value()
return value
## スピンボックスの数だけ処理を実行し、プログレスバーを進める
def doIt(self):
# スピンボックスの数を取得 → 処理する回数
maxNum = self.getSpinBoxNum()
# プログレスバーの最大値を取得したスピンボックスの数に指定
self.UI.progressBar.setMaximum(maxNum)
# 処理する回数分ループを回す
for current in range(maxNum):
# ここに実際の処理が入ってるテイで
print '*' * (current+1)
# 1秒くらい処理かかるというつもり
time.sleep(1)
# 処理が終わったらプログレスバーを進める
self.UI.progressBar.setValue(current+1)
# ループを抜けたあと一応最大値で埋めておく
self.UI.progressBar.setValue(maxNum)
# 以上!
#------------------------------------------------------------------------------
## GUIの起動
def main():
app = QtGui.QApplication(sys.argv)
ui = GUI()
ui.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
#-----------------------------------------------------------------------------
# EOF
#-----------------------------------------------------------------------------
ちょっと1行ずつ解説するのが大変なので、コメントに説明入れましたゴメンナサイ
QtDesinerのときにUIの部品にきちんと名前を付けておけと言っていたのは
コーディングする際に、そのままアトリビュート名になるからです
(self.UI.ok_pushButton、self.UI.num_spinBoxのように)
出来たらさっきのショートカットから起動して、スピンボックスの数を適当に増やしてOKボタンを押してみましょう!
スピンボックスの数分プログレスバーがちょっとずつ伸びていく動作になったでしょうか?
QtDesinerのときにUIの部品にきちんと名前を付けておけと言っていたのは
コーディングする際に、そのままアトリビュート名になるからです
(self.UI.ok_pushButton、self.UI.num_spinBoxのように)
出来たらさっきのショートカットから起動して、スピンボックスの数を適当に増やしてOKボタンを押してみましょう!
スピンボックスの数分プログレスバーがちょっとずつ伸びていく動作になったでしょうか?
長々と書いてしまいましたが、お手軽にそれなりにちゃんとしてる感じになる
UI付きツール開発についてまとめてみました
参考になればさいわいでーす
UI付きツール開発についてまとめてみました
参考になればさいわいでーす




0 件のコメント:
コメントを投稿