アイコンやショートカットもつけたい場合はこちらの記事を参照して下さい。
touch-sp.hatenablog.com
サンプルスクリプト
from PyQt6.QtCore import QSize from PyQt6.QtWidgets import QApplication,QLabel,QMainWindow from PyQt6.QtGui import QAction from collections import OrderedDict menu_list = OrderedDict( ファイル = ['新規', '保存', '終了'], 編集 = ['切り取り', 'コピー', '貼り付け', '全選択'], ヘルプ = ['バージョン情報'] ) class Window(QMainWindow): def __init__(self): super().__init__() self.setFixedSize(QSize(400,300)) self.label = QLabel() self.setCentralWidget(self.label) self.menubar = self.menuBar() self.menu = [] self.action = [] for key, val in menu_list.items(): self.menu.append(self.menubar.addMenu(key)) for submenu in val: self.action.append(QAction(submenu)) self.menu[-1].addAction(self.action[-1]) self.action[-1].triggered.connect(self.menubarAction) def menubarAction(self): self.label.setText(f'You pushed {self.sender().text()}!') if __name__ == "__main__": app = QApplication([]) ex =Window() ex.show() app.exec()
ポイント
追加したいメニューバーの内容をあらかじめ辞書型変数で定義しました。from collections import OrderedDict menu_list = OrderedDict( ファイル = ['新規', '保存', '終了'], 編集 = ['切り取り', 'コピー', '貼り付け', '全選択'], ヘルプ = ['バージョン情報'] )
何となくOrderedDictを使いましたが普通のdictでも問題なく動作すると思います。
QMenuとQActionは一つずつappendでリストに追加しています。
入れたばかりのものにはindex -1でアクセスしています。
self.menu = [] self.action = [] for key, val in menu_list.items(): self.menu.append(self.menubar.addMenu(key)) for submenu in val: self.action.append(QAction(submenu)) self.menu[-1].addAction(self.action[-1]) self.action[-1].triggered.connect(self.menubarAction)
参考にさせて頂いたサイト
qiita.com「triggered.connect」の部分でうまくいかずにはまりました。
こちらに解決方法が載っていたので参考にさせて頂きました。
stackoverflow.com
結局はsender()で受け取ったためlambda式は使いませんでしたが。
2022年4月21日追記(PyInstallerでexe化)
pyinstaller menu_sample.py --noconsole --onefile
上記コマンドで問題なくexe化できました。
altgraph==0.17.2 future==0.18.2 pefile==2021.9.3 pyinstaller==5.0 pyinstaller-hooks-contrib==2022.4 PyQt6==6.3.0 PyQt6-Qt6==6.3.0 PyQt6-sip==13.3.1 pywin32-ctypes==0.2.0