Blog

超簡単にメニューバーアプリを作りたい(macOS)

基幹システムグループ所属、新卒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
  • rumpsライブラリ 
    • pip にてインストールする場合は以下のコマンドをコマンドプロンプト等で実行します。

ファイル構成

iconはこちらのサイトからダウンロードできます。

※Tools icons created by Freepik – Flaticon

動作デモ(rumps_sample.py)

  • 当デモスクリプトは、以下の動作を行います。
    • メニューバーアプリのUI表示
    • 通知機能
  • 補足
    • 通知やポップアップウィンドウの表示にはmac側の許可が必要になります。
動作イメージ

コードの説明

App.menu

初期化部分ではApp.menuにMenuItemを配列として入れることで、よく見るメニューの形にしてくれます。

それぞれのMenuItemにはコールバック関数を指定することができ、指定したものは押下可能状態になります。ボタンを押下することで指定した関数が実行できます。

また、menu配列に配列を入れることでサブメニューを作成することもできます。

App.menu

App.icon

App.iconには画像を指定することでメニューバーアプリのアイコンを設定、変更できます。

プログラムの実行中でもiconを変更することができるため、何かのステータスをアイコンで表示するということもできます。

noticication

notificationが呼ばれると通知が発火し、dataに入れたdictはrumps.notificationsに渡されます。

title, subtitle, messageそれぞれに指定したテキストが表示されます。

notification

notifications

下記は通知をクリックした時の処理を設定できます。notificationから渡ってきた辞書型のdataを利用できます。

timer

rumps.Timerを用いれば一定間隔で特定の処理をバックグラウンドで実行することができます。

以下の例ではhoge関数を1分置きに実行しています。

タイマーを停止するにはどこかでsample_timer.stop()する必要があります。

一度タイマーを停止することでプログラム実行中でもsample_timer**.**interval **=** 30のように実行する間隔を変更することができます。

スタンドアロン化(参考)

py2appのインストール

rumpsアプリをビルドすることができるpy2appを導入する setup.pyの作成 ファイルが生成されるので以下のように編集する ビルドするとdist配下にアプリケーションが生成される

TIPS

  • アプリケーション実行時にアセットの読み込みやライブラリが不足していた場合エラーになるが詳しいエラー内容まではわからない。下記のようにアプリケーションを実行するとターミナルに詳細なエラーが表示される。
  • 開発時にデバックモードをオンにしておくとタイマーなどの挙動がわかりやすい。

業務ツールを作ってみた(作例)

機能

  • 出勤
    • slackステータス変更
      • slack APIよりステータス変更
    • 打刻(ページ遷移)
      • 打刻ページをブラウザで開く
  • 退勤
    • slackステータス変更
      • slack APIよりステータス変更
    • 打刻(ページ遷移)
      • 打刻ページをブラウザで開く
  • 日報
    • 日報を投稿する機能
      • 日報に APIがないためバッグラウンドでseleniumで動作
  • 設定
    • 勤務地を設定する機能
  • 打刻忘れアラート
    • APIで打刻状況を取得、打刻忘れがあれば通知を出す。

イメージ

※nigiri icons created by Freepik – Flaticon
メニュー
日報フォーム

最後に

いかがだったでしょうか?メニューバーアプリが数行のコードで簡単に作成できることを分かっていただけたかと思います。

Pythonで開発ができるので、機械学習や計算などの豊富なライブラリを利用できます。そのため、様々な機能の実装が選択肢に入ってくるのが魅力的だと思います。

作例として定常ワークフローをツールにしたものでは、ワークフロー全体を一か所で管理することが可能となり、出勤時に必要なタスクを簡単に処理できるようになりました。この効率化は打刻を忘れるリスクを減少させ、出勤時のワークフローをスムーズに実行できるようになったかと思います。また、メニューバーに彩りが増えることで気分的にハッピーになったような気がしますね。

We are hiring!

ニフティでは、さまざまなプロダクトへ挑戦するエンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトよりお気軽にご連絡ください! カジュアル面談も受け付けています! Tech TalkやMeetUpも開催しております!
こちらもお気軽にご応募ください!