
はじめに
前回メニューバーを実装しました。touch-sp.hatenablog.com
今回はツールバーを実装したいと思います。
サンプルスクリプト
from PyQt6.QtCore import Qt, QSize from PyQt6.QtWidgets import QApplication, QLabel, QMainWindow, QToolBar from PyQt6.QtGui import QIcon,QAction toolbar_icons = [ { 'name': 'Menu', 'icon': './icon/menu.svg'}, { 'name': 'Home', 'icon': './icon/home.svg'}, { 'name': 'Settings', 'icon': './icon/settings.svg'}, { 'name': 'Exit', 'icon': './icon/x-circle.svg'}, ] class Window(QMainWindow): def __init__(self): super().__init__() self.setFixedSize(QSize(600, 450)) self.label = QLabel() self.setCentralWidget(self.label) self.toolbar = QToolBar() self.toolbar.setIconSize(QSize(32,32)) self.toolbar.setStyleSheet("QToolBar {background: rgb(51, 51, 51); spacing: 10px;}") self.addToolBar(Qt.ToolBarArea.LeftToolBarArea, self.toolbar) self.toolbar.setMovable(False) self.all_icon = [] for each_icon in toolbar_icons: icon_name = each_icon.get('name') icon_path = each_icon.get('icon') self.all_icon.append(QAction(QIcon(icon_path), icon_name, self)) self.toolbar.addAction(self.all_icon[-1]) self.all_icon[-1].triggered.connect(self.toolbarAction) def toolbarAction(self): self.label.setText(f'You pushed {self.sender().text()} icon!') if __name__ == "__main__": app = QApplication([]) ex =Window() ex.show() app.exec()
ポイント
アイコン画像はこちらのものを使わせて頂きました。feathericons.com
「icon」フォルダを作成しそちらに使用するアイコンを入れました。
ダウンロードの際にcolorを「#FFFFFF」に設定しておくと白いアイコンがダウンロードできます。
もし黒でダウンロードした場合にはエディタでsvgファイルを開いてstrokeをwhiteに書き直すと白くなります。
追加したいアイコンの内容を一つずつ辞書型で定義しました。
キーの種類は「name」「icon」です。両方とも必須になります。
「icon」にはアイコンファイルのパスを記述します。
toolbar_icons = [
{ 'name': 'Menu', 'icon': './icon/menu.svg'},
{ 'name': 'Home', 'icon': './icon/home.svg'},
{ 'name': 'Settings', 'icon': './icon/settings.svg'},
{ 'name': 'Exit', 'icon': './icon/x-circle.svg'},
]
QActionは一つずつappendでリストに追加しています。
入れたばかりのものにはindex -1でアクセスしています。
self.all_icon = [] for each_icon in toolbar_icons: icon_name = each_icon.get('name') icon_path = each_icon.get('icon') self.all_icon.append(QAction(QIcon(icon_path), icon_name, self)) self.toolbar.addAction(self.all_icon[-1]) self.all_icon[-1].triggered.connect((lambda state, x = icon_name: self.toolbarAction(x)))
PyInstallerでexe化
pyinstaller toolbar_sample.py --noconsole
または
pyinstaller toolbar_sample.py --noconsole --onefile
上記コマンドで問題なくexe化できました。
ただし「icon」フォルダを作成したexeファイルと同じフォルダに配置する必要があります。
つまり--onefileを付けても完全なonefile化はできていませんので注意して下さい。
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
2022年5月12日追記
つづきを書きました。touch-sp.hatenablog.com