Python Python 活用 プログラミング

【python】【PyQt5】デスクトップアプリ化して配布 -その3 ツールバー(QToolBar)の追加-

 

前回の記事「デスクトップアプリ化して配布 -その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のコードを参照ください。<参照コード>

-Python, Python 活用, プログラミング