前回の記事「デスクトップアプリ化して配布 -その2 メニューの追加-」でメニューを追加しました。
その続きとして、次はツールバー(QToolBar)を追加します。
-
参考【python AI】pytorch SSD 物体検出の実装方法 -学習と確認-
続きを見る
本記事の内容
- ツールバーの配置
- ツールバーのアクションの設定
今回の記事では、次のようなツールバーを追加していきます。
これがあるだけで、だいぶアプリらしさが出てきますね。
app.batを変更
今回は新しく、main_view3.pyを作成していきます。
サンプルコードをダウンロードされた方は、app.batを次のように変更してください。
@echo off call _internal\setenv.bat "%PYTHON_EXECUTABLE%" "%APP_ROOT%\main_view3.py" pause
main_view3.pyを起動するように変更しています。
app.batを実行するとデスクトップアプリが起動するようになっています。
ツールバーの配置
前回の記事「デスクトップアプリ化して配布 -その2 メニューの追加-」で作成したmain_view2.pyをベースにツールバーを追加していきます。
追加する場所は、MainViewの__init__の中です。
次のコードを追加します。
# ToolBarを定義 title = 'Tools' self.tools = QToolBar(title) self.tools.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) # self.addToolBar(Qt.LeftToolBarArea, toolbar) #左に配置 self.addToolBar(Qt.TopToolBarArea, self.tools) #上に配置
処理流れ
- QToolBarでツールバーを定義
- setToolButtonStyleでアイコン付きのボタンを選択
- self.addToolBarでツールバーをデスクトップアプリに追加して、Qt.TopToolBarAreaで上に配置。
配置は、デスクトップアプリ起動後でもユーザーがツールバーをドラッグ&ドロップで、上下左右に移動することができます。
あとは、このツールバーにボタンとアクションを設定します。
ツールバーのアクションを設定
ツールバーのアクションを設定していきます。
メニューと同じく、アクションはQActionを使って設定していきます。
前回作成した、new_action関数を使いまわします。
def new_action(parent, text, slot=None, shortcut=None, icon=None, tip=None, enabled=True): """actionの設定と取得""" # アクション取得 a = QAction(text, parent) # icon設定 iconsフォルダから取得 if icon is not None: a.setIcon(QIcon('icons/'+icon)) # ショートカット作成 if shortcut is not None: if isinstance(shortcut, (list, tuple)): a.setShortcuts(shortcut) else: a.setShortcut(shortcut) # ステータスバーに表示するTip if tip is not None: a.setToolTip(tip) a.setStatusTip(tip) # 押したときの動作 if slot is not None: a.triggered.connect(slot) # ロックするか a.setEnabled(enabled) return a
関数の引数は以下の役割を持っています。
引数 | 役割 |
---|---|
text | メニューの文字列。 |
solt | メニューのアクション。処理する関数を指定する。 |
shortcut | 'Ctrl+Q'などショートカットを指定。 |
icon | メニューに表示するicon。iconsフォルダから読み込むようになっています。 |
tip | カーソルがメニュー上にきたときに、ステータスバーに表示するコメント。 |
enable | ボタンをロックするかどうか。 |
この関数を使って、アクションを設定していきましょう。
ファイル開く、保存するという、よくあるボタンを配置します。
# ツールバーのアクションを定義 open_file = new_action(self, text='OpenFile', slot=self.open_file, icon='open', tip='Open File') save_file = new_action(self, text='SaveFile', slot=self.save_file, shortcut='Ctrl+S', icon='save', tip='Save File') # ツールバーにアクションを追加 self.tools.clear() self.tools.addAction(open_file) self.tools.addAction(save_file)
やっていることは
処理流れ
- new_actionでアクションを設定して取得
- tools(QToolBar)にaddActionでアクションを設定
アクションで実行される関数を作成
ボタンを押した時に実行される、self.open_fileとself.save_fileを作成します。
中身は適当にCSVを読み書きしているだけなので、おまけ程度に、参考にしていただければと思います。
ここでは新しく、ファイルダイアログを使うことができるQFileDialogとメッセージを表示するQMessageBoxを使っていきます。
メソッド | 役割 |
---|---|
QFileDialog.getOpenFileName | ファイルを開くダイアログ 引数1:self固定 引数2:ダイアログタイトル 引数3:初期のファイル名 引数4:ファイルフィルタ |
QFileDialog.getSaveFileName | ファイルを保存するダイアログ 引数1:self固定 引数2:ダイアログタイトル 引数3:初期のファイル名 引数4:ファイルフィルタ |
QMessageBox.information | 通常のメッセージボックス 引数1:self固定 引数2:メッセージタイトル 引数3:メッセージ内容 |
QMessageBox.critical | エラーのメッセージボックス 引数1:self固定 引数2:メッセージタイトル 引数3:メッセージ内容 |
読み込んだデータは保持しておきたいので、__init__の最後に次のコードを追加します。
self.load_data = None
open_file
csvファイルを読み込むようにします。
読み込んだデータは、load_dataに保持します。
def open_file(self): """ ツールバーメソッド """ fp = QFileDialog.getOpenFileName(self, 'CSV 読込先を選択', "hoge.csv", "CSV (*.csv)") if fp[0]: with open(fp[0]) as f: self.load_data = f.read() QMessageBox.information(self, 'ファイル読み込み', '正常に読み込みました。') print(self.load_data)
読み込みのファイルダイアログには、QFileDialog.getOpenFileNameを使います。
save_file
csvファイルに書き込むようにします。
書き込むデータは、load_dataをそのまま保存します。
データが読み込まれていない場合は、エラーを出力しています。
def save_file(self): """ ツールバーメソッド """ if self.load_data: fp = QFileDialog.getSaveFileName(self, 'CSV 保存先を選択', "hoge.csv", "CSV (*.csv)") if fp[0]: with open(fp[0], mode='w') as f: f.write(self.load_data) QMessageBox.information(self, 'ファイル保存', '正常に保存しました。') else: QMessageBox.critical(self, 'Error Message', 'データ読み込まれていません。')
書き込み用のファイルダイアログはQFileDialog.getSaveFileNameを使います。
これで、ツールバーもついた、デスクトップアプリになりました。
完成したmain_view3.pyはgit hubのコードを参照ください。<参照コード>