Python Python 活用 プログラミング

【python】【PyQt5】デスクトップアプリ化して配布 -その2 メニューの追加-

 

前回の記事「デスクトップアプリ化して配布 -その1 ウィンドウを作成-」で空のデスクトップを作成したので、その続きとして、メニューとステータスバーをを配置していきます。

参考【python】【PyQt5】デスクトップアプリ化して配布 -その1 ウィンドウを作成-

続きを見る

 

本記事の内容

  • メニューの配置
  • メニューのアクションの設定

 

 

今回の記事では、次のようなメニューを追加していきます。

 

サンプルコード

 

スポンサーリンク

app.batを変更

今回は新しく、main_view2.pyを作成していきます。

サンプルコードをダウンロードされた方は、app.batを次のように変更してください。

@echo off
call _internal\setenv.bat

"%PYTHON_EXECUTABLE%" "%APP_ROOT%\main_view2.py"

pause

main_view2.pyを起動するように変更しています。

app.batを実行するとデスクトップアプリが起動するようになっています。

 

メニューの配置

 

前回の記事「デスクトップアプリ化して配布 -その1 ウィンドウを作成-」では、以下のような空のWindowを作成しました。

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys

class MainWindow(QMainWindow):
    def __init__(self) -> None:
        super(MainWindow, self).__init__()
        self.resize(QSize(600, 500))
        self.setWindowTitle('app')

def get_main_app(argv=[]):
    app = QApplication(argv)
    win = MainWindow()
    win.show()
    return app, win

if __name__ == '__main__':
    app, _win = get_main_app(sys.argv)
    sys.exit(app.exec_())

 

これをベースに、メニューを追加していきます。

追加する場所は、MainViewの__init__の中です。

次のコードを追加します。

# メニューの追加
self.menus = {'File': self.menuBar().addMenu('File'),
              'Edit': self.menuBar().addMenu('Edit'),
              'Help': self.menuBar().addMenu('Help'),}

 

QMainWindowのmenuBarでメニューを追加します。

作成されたメニューはmenusに、dict型でまとめて入れておきます。

 

これだけでは、メニューから実行するアクションが設定できていません。

 

 

メニューのアクションを設定

メニューのアクションを設定していきます。

アクションはQActionを使って設定していきます。

 

メニュー表示テキストのみだけでなく、iconやショートカットの設定もあるので、まとめて設定できるように関数にします。

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 メニューをロックするかどうか。

 

 

この関数を使って、アクションを設定していきましょう。

File>quitとHelp>infomationの二つを設定し、Editは何もしていない状態です。

# アクションを設定する
quit = new_action(self,
                  text='quit',
                  slot=self.close,
                  shortcut='Ctrl+Q',
                  icon='quit',
                  tip='quitApp')
show_info = new_action(self,
                       text='information',
                       slot=self.show_info,
                       tip='show app information')
self.menus['File'].addAction(quit)
self.menus['Help'].addAction(show_info)

 

やっていることは

処理流れ

  • new_actionでアクションを設定して取得
  • menusにaddActionでアクションを設定

 

アクションで実行される関数を作成

quitではself.close、infomationではself.show_infoがslotに設定されています。

self.closeは、QMainWindowのアプリ終了のメソッドなので、何もしなくて良いですが、self.show_infoはメソッドを用意します。

def show_info(self):
    """ Helpメニュ用メソッド """
    print("desktop app")

 

ただ、printを動かしているだけです。

メニューに独自の処理を実装する場合は、このように実装してください。

 

 

ステータスバーの設定

最後のに、メニューのTip(補助メッセージ)を表示する、ステータスバーを設定しておきます。

# ステータスバー
self.statusBar()

 

これで、メニューつきのデスクトップアプリになりました。

完成したmain_view2.pyはgit hubのコードを参照ください。<参照コード>

 

次はQToolBarを使って、ツールバーを追加していきたいと思います。

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

続きを見る

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