ご無沙汰しております。
最近めっきり更新をさぼっておりましたが、
仕事納めも済んだことだし、冬休み期間にまたいろいろ書けたらなと。
そんでネタ何にしよかなと思ったんですが、
今年やってたことを振り返ると、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 件のコメント:
コメントを投稿