【Python】Windowsでポップアップ通知(通知バナー)をデスクトップに表示する:Plyer

時計 2022.05.24 / 時計

【Python】Windowsでポップアップ通知(通知バナー)をデスクトップに表示する:Plyer

本記事ではPythonを使って、Windowsのデスクトップ画面にポップアップ通知通知バナー)を表示する方法について解説していきます。

バックグラウンドで動いているアプリケーションで、なにかしらの更新(データベースなど)や問題が発生したら、その状況を通知したいことがあります。

PythonではPlyerライブラリを利用することで簡単に通知バナーをデスクトップ画面に表示できます。Plyerを使って進捗状況などを通知バナーで表示する方法を見ていきましょう。

本記事は以下のバージョンで行っています。

> Python -V
Python 3.9.7

Plyer

Plyerとは

Plyerとはハードウェアや様々なプラットフォームで共通する機能にアクセスするためのPythonライブラリです。Windowsだけでなく、MacやLinux、iOSなど様々なOSに対応しています。

PlyerはPythonに最初からインストールされている標準ライブラリではないため、別途インストールが必要です。

Plyerのライセンス形態はMITライセンスです。

ここではPlyerでNotificationsを使って、通知バナーを表示していきます。

IT用語の確認

通知バナーとは画面右下の隅にポップアップ表示されるメッセージ表示のことです。トーストとも呼ばれます。アプリケーションからの通知やアラート情報をユーザーに知らせるために使用されます

通知バナー

PlyerのサポートAPI

Platform Android iOS Windows OS X Linux
Accelerometer
Audio recording
Barometer
Battery
Bluetooth
Brightness
Call
Camera (taking picture)
Compass
CPU count
Devicename
Email (open mail client)
Flash
GPS
Gravity
Gyroscope
Humidity
IR Blaster
Light
Native file chooser
Notifications
Orientation
Proximity
Screenshot
SMS (send messages)
Spatial Orientation
Speech to text
Storage Path
Temperature
Text to speech
Unique ID
Vibrator
Wifi

本記事で利用する「Notifications」はiOSでは利用できないのでご注意ください。

Plyerのインストール

Plyerは標準ライブラリではないため、以下のようにpipコマンドでインストールします。

pip install plyer

「Successfully installed 」と表示されれば無事インストールの完了です。2022年5月現在ではplyer -2.0.0がインストールされます。

Plyerによる通知バナーを表示する

plyer.notification.notifyの使用

通知バナー(トースト通知)を表示するにはplyer.notification.notify()を使用します。notify()の構文は以下の通りです。

構文

notify(title='', message='', app_name='', app_icon='', timeout=10, ticker='', toast=False)

パラメーター 説明
title (str) 通知バナーのタイトル
message (str) 通知バナーに表示するメッセージ
app_name (str) 通知を発行するアプリケーション名
app_icon (str) メッセージと共に通知バナーに表示するアイコン
timeout (int) 通知バナーを表示する時間、デフォルトは10
注意

Windowsの場合、app_iconに指定する画像の拡張子はicoにしてください

通知バナーを表示する

実際にplyer.notification.notifyを使って通知バナーを表示してみましょう。

Pythonスクリプトの先頭では以下のようにnotificationをインポートすることが多いです。

from plyer import notification

以下コードを実行すると10秒後に自動的に消える通知バナーが表示されます。

from plyer import notification

notification.notify(
    title="通知バナー",
    message="メッセージ",
    app_name="アプリ名",
    app_icon="C:\office\office.ico",
    timeout=10
)
通知バナー

サンプルプログラム

定期的に通知バーを表示

1分ごとに通知バーを表示するプログラムを以下に記します。

from plyer import notification
import time

def notice():
    notification.notify(
        title = "通知バナー",
        message = str(i) + "分経過",
        app_name = "アプリ名",
        app_icon = "C:\office\office.ico",
        timeout = 10,
    )

i = 1
while True:
    time.sleep(60)
    notice()
    i = i + 1

タスクトレイから定期的なプログラムを停止

上記で作成した定期的なプログラムは一度起動したら強制的にプログラムを終了する以外に停止する方法がありません。

そこでタスクトレイにプログラムを停止できるアプリケーションアイコンを追加し、そこからプログラムを停止できるようにします。

from plyer import notification
import time
import threading
from pystray import Icon, Menu, MenuItem
from PIL import Image

def notice():
    notification.notify(
        title = "通知バナー",
        message = str(i) + "分経過",
        app_name = "アプリ名",
        app_icon = "C:\office\office.ico",
        timeout = 10,
    )

def quit_app():
    global status
    icon.stop()
    status = False

def run_app():
    pass

def task_tray():
    global icon
    image = Image.open("C:\office\office.ico")
    menu = Menu(MenuItem('Quit', quit_app), MenuItem('Run', run_app))
    icon = Icon(name='test', icon=image, title='pystray App', menu=menu)
    icon.run()

i = 1
status = True

task_thread = threading.Thread(target=task_tray)
task_thread.start()

while status:
    time.sleep(20)
    notice()
    i = i + 1

ここではタスクトレイにアプリを常駐させれるpystrayを使用しています。pystrayについては以下記事をご参照ください。

exe化して配布・起動時に実行できるようにする

作成したプログラムはexe化することで社内の人に配布できるようにすると便利です。exe化するにはpyinstallerを利用します。

pyinstallerは標準ライブラリではないので、pipで別途インストールしましょう。

pip install pyinstaller

pyinstallerでプログラムをexe化するには以下のコマンドを実行します。

pyinstaller pyスクリプト名 --onefile

pyinstallerの使い方については以下記事をご参照ください。

exe化することにより他の人に配布できるようになりました。Windowsのスタートアップにそのexeファイルを追加すれば、パソコン起動時に自動的に動くようにできます。

スタートアップへの追加方法は以下記事をご参照ください。

まとめ

本記事「【Python】Windowsでポップアップ通知(通知バナー)をデスクトップに表示する:Plyer」はいかがでしたか。

Pythonでデスクトップアプリケーションを作成している方には非常に便利なライブラリです。ぜひPlyerを利用してみてください。