基幹システムグループ所属、新卒1年目のいなつぐです。
現在はジョブローテでPythonやJavaを使った業務に携わっています。
本稿ではMacのメニューバーアプリが簡単に作成できるpythonライブラリであるrumpsについて紹介したいと思います。
rumpsの基本的な使い方から始め、勤怠関係の定常業務を一つにまとめてみたというrumpsの活用方法までを紹介します。
rumpsとは?
rumpsとは、Macのメニューバーアプリを簡単に作成できるpythonライブラリです。
Macでメニューバーアプリを作成するにはXcodeでSwiftやObjective-Cなどの言語を使用する必要があり、簡単なアプリでもこれらの言語の初学者にとっては学習コストがめっっちゃ高い(個人的な感想)ため、取っ付きにくく感じました。
ですが、
そんなハードルを全て薙ぎ倒してくれるのがこのrumpsです。
QtやtkinterでGUIアプリを作成したことがあればイメージが付きやすいですが、GUIのビューを構成する数行のコードとそれぞれのボタンを押した時に発火するコールバック関数を書くだけでメニューバーアプリとして動作します。
rumpsを動かしてみる
本項ではサンプルを用いて rumps を使ったメニューバーアプリ作成の基本を紹介します。
自身のメニューバーアプリ作成の参考になれば幸いです。
サンプルでは実例とともにrumpsの機能を軽く紹介します。
利用準備
- Mac
- pyenv
- Python 3.11.4
1 2 |
# pyenvのPythonはデフォルトではフレームワークとして使えないためenable-frameworkオプションを指定 env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.11.4 |
1 2 |
# グローバルで使用するバージョンを3.11.4に切り替える pyenv global 3.11.4 |
- rumpsライブラリ
- pip にてインストールする場合は以下のコマンドをコマンドプロンプト等で実行します。
1 |
pip install rumps |
ファイル構成
iconはこちらのサイトからダウンロードできます。
※Tools icons created by Freepik – Flaticon
1 2 3 4 5 |
. ├── rumps_sample.py ├── icon ├── icon_on.png └── icon_off.png |
動作デモ(rumps_sample.py)
- 当デモスクリプトは、以下の動作を行います。
- メニューバーアプリのUI表示
- 通知機能
- 補足
- 通知やポップアップウィンドウの表示にはmac側の許可が必要になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
from rumps import * # ログを表示できるようにする rumps.debug_mode(True) class SampleApp(App): ### メニューバーアプリのUI作成 def __init__(self): super(SampleApp, self).__init__("sample") self.menu=[ MenuItem("hoge",callback=self.hoge), [MenuItem("menu"),[MenuItem(f"submenu{i}", callback=self.hoge) for i in range(10)]], MenuItem("fuga",callback=self.fuga), rumps.separator, MenuItem("none",callback=None), rumps.separator, ] self.icon="icon/icon_on.png" ### コールバック関数 def hoge(self, sender): print("hoge") def fuga(self,sender): data = {"key1":"value1", "key2":"value2"} notification(title="title", subtitle="subtitle", message="message", data=data) ### 通知をクリックした時の処理 @notifications def notification_center(data): print(data["key2"]) if __name__ == "__main__": app = SampleApp() sample_timer = rumps.Timer(app.hoge, 60) sample_timer.start() app.run() |
コードの説明
App.menu
初期化部分ではApp.menuにMenuItemを配列として入れることで、よく見るメニューの形にしてくれます。
それぞれのMenuItemにはコールバック関数を指定することができ、指定したものは押下可能状態になります。ボタンを押下することで指定した関数が実行できます。
また、menu配列に配列を入れることでサブメニューを作成することもできます。
App.icon
App.iconには画像を指定することでメニューバーアプリのアイコンを設定、変更できます。
プログラムの実行中でもiconを変更することができるため、何かのステータスをアイコンで表示するということもできます。
1 2 3 4 5 6 7 8 9 10 11 |
def __init__(self): super(SampleApp, self).__init__("sample") self.menu=[ MenuItem("hoge",callback=self.hoge), [MenuItem("menu"),[MenuItem(f"submenu{i}", callback=self.hoge) for i in range(10)]], MenuItem("fuga",callback=self.fuga), rumps.separator, MenuItem("none",callback=None), rumps.separator, ] self.icon="icon/icon_on.png" |
noticication
notificationが呼ばれると通知が発火し、dataに入れたdictはrumps.notificationsに渡されます。
title, subtitle, messageそれぞれに指定したテキストが表示されます。
1 2 3 |
def fuga(self,sender): data = {"key1":"value1", "key2":"value2"} notification(title="title", subtitle="subtitle", message="message", data=data) |
notifications
下記は通知をクリックした時の処理を設定できます。notificationから渡ってきた辞書型のdataを利用できます。
1 2 3 |
@notifications def notification_center(data): print(data["key2"]) |
timer
rumps.Timerを用いれば一定間隔で特定の処理をバックグラウンドで実行することができます。
以下の例ではhoge関数を1分置きに実行しています。
タイマーを停止するにはどこかでsample_timer.stop()
する必要があります。
一度タイマーを停止することでプログラム実行中でもsample_timer**.**interval **=** 30
のように実行する間隔を変更することができます。
1 2 3 4 5 |
if __name__ == "__main__": app = SampleApp() sample_timer = rumps.Timer(app.hoge, 60) sample_timer.start() app.run() |
スタンドアロン化(参考)
py2appのインストール
rumpsアプリをビルドすることができるpy2appを導入する
1 |
pip install py2app |
setup.pyの作成
1 |
py2applet --make-setup rumps_sample.py |
ファイルが生成されるので以下のように編集する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
""" This is a setup.py script generated by py2applet Usage: python setup.py py2app """ from setuptools import setup APP = ['rumps_sample.py'] APP_NAME = "rumps_sample" # アプリの名前 DATA_FILES = [] OPTIONS = { 'plist': { 'LSUIElement': True, # 実行時にDockに表示させない設定 'CFBundleName': APP_NAME, 'CFBundleDisplayName': APP_NAME, }, 'iconfile':'icon/icon_off.png', 'resources': ['icon'], } setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], ) |
ビルドするとdist配下にアプリケーションが生成される
1 |
python setup.py py2app |
TIPS
- アプリケーション実行時にアセットの読み込みやライブラリが不足していた場合エラーになるが詳しいエラー内容まではわからない。下記のようにアプリケーションを実行するとターミナルに詳細なエラーが表示される。
1 |
dist/rumps_sample.app/Contents/MacOS/rumps_sample |
- 開発時にデバックモードをオンにしておくとタイマーなどの挙動がわかりやすい。
1 |
rumps.debug_mode(True) |
業務ツールを作ってみた(作例)
機能
- 出勤
- slackステータス変更
- slack APIよりステータス変更
- 打刻(ページ遷移)
- 打刻ページをブラウザで開く
- slackステータス変更
- 退勤
- slackステータス変更
- slack APIよりステータス変更
- 打刻(ページ遷移)
- 打刻ページをブラウザで開く
- slackステータス変更
- 日報
- 日報を投稿する機能
- 日報に APIがないためバッグラウンドでseleniumで動作
- 日報を投稿する機能
- 設定
- 勤務地を設定する機能
- 打刻忘れアラート
- APIで打刻状況を取得、打刻忘れがあれば通知を出す。
イメージ
※nigiri icons created by Freepik – Flaticon
最後に
いかがだったでしょうか?メニューバーアプリが数行のコードで簡単に作成できることを分かっていただけたかと思います。
Pythonで開発ができるので、機械学習や計算などの豊富なライブラリを利用できます。そのため、様々な機能の実装が選択肢に入ってくるのが魅力的だと思います。
作例として定常ワークフローをツールにしたものでは、ワークフロー全体を一か所で管理することが可能となり、出勤時に必要なタスクを簡単に処理できるようになりました。この効率化は打刻を忘れるリスクを減少させ、出勤時のワークフローをスムーズに実行できるようになったかと思います。また、メニューバーに彩りが増えることで気分的にハッピーになったような気がしますね。