pystrayにおける左クリックイベント実装方法

久しぶりのnote投稿です。前にPHPの記事を書いたと思いますが今はもうPHPはやっておらずPythonをメインで組んでいます。やっぱり流行りに乗った方がいいよね!
この記事見てるかたはおそらくプログラミングなんて余裕だぜの方が多いと思いますので先に結論だけ書きます。

MenuItem('左クリック', click_func, default=True)

これでアイコンを左クリックすればclick_func関数が実行されます。

ではなぜこの記事を書いたのか。それはググっても出てこないから忘れないうちに残したかったからです。
Pythonでタスクトレイ常駐アプリを作ろうとしていたのですが多くのタスクトレイ常駐アプリはクリックすれば何かしらの反応があるものが多いと思います。それを実現しようと色々調べていて、pystrayを使うところまではわかった。タスクトレイに常駐させる方法もわかった。""クリックメニューの作り方はわかった。定期実行の方法もわかった。でも…
左クリックの実装方法だけがわからない!
なぜか右クリックメニューの作り方がたくさんヒットします…

というわけでタスクトレイに常駐させ、アイコンを左クリックしたときにコンソール画面(コマンドプロンプト)を表示させる簡単なコードを作ってみました。

from pystray import Icon, MenuItem, Menu
from PIL import Image
import win32gui

def forground(hwnd, title):
    global window_id
    name = win32gui.GetWindowText(hwnd)
    if name.find(title) >= 0:
        window_id = hwnd
def forground_console():
    if win32gui.IsIconic(window_id):
        win32gui.ShowWindow(window_id,1)
def quit_app():
    icon.stop()

win32gui.EnumWindows(forground, 'py.exe')
image = Image.open('icon.ico')
menu = Menu(
    MenuItem('表示', forground_console, default=True),
    MenuItem('終了', quit_app)
)
icon = Icon(name='test', icon=image, title='pystray App', menu=menu)
icon.run()

実はコンソール画面を表示させる方法も結構難しかったのですがここでは割愛します。これでも結構強引な手法だなと思いました。

わかってしまえばすごく簡単な話でした。

menu = Menu(
    MenuItem('表示', forground_console, default=True),
    MenuItem('終了', quit_app)
)

右クリックメニューの実装は上記のような感じかと思いますが、これにオプションでdefault=Trueをつければよかったんですね。
なお、指定しなかった場合はデフォルトはfalseになります。
このオプションは盲点でした。ドキュメントを見てもそのままデフォルト項目に指定するしか書かれていなかったので単なる飾りだと思ってたんですがちゃんと意味はあったんですね。

仕事でこういったプログラミングやスプレッドシート使っていますが、時間が立つと忘れてそのたびに再度調べ直していたのですが、こうやって記録に残していくのは大事です。

この記事が気に入ったらサポートをしてみませんか?