Tkinterウィンドウをタスクバー(システムトレイ)に表示する方法を解説
システムトレイアプリケーションは、常にタスクバー上に常駐するタイプのアプリです。ユーザーがアプリのウィンドウを閉じても、プロセス自体はバックグラウンドで動作し続け、タスクバーの通知領域(システムトレイ)にアイコンとして表示されます。システムトレイアプリであることを視覚的に識別できるよう、独自の画像やアイコンを設定するのが一般的です。
pystrayモジュールを使ったシステムトレイアイコンの作成
Tkinterアプリケーションにシステムトレイアイコンを実装するには、Pythonのpystrayモジュールを利用します。pystrayには、アプリのトレイアイコンを柔軟に構成するための組み込み関数やメソッドが多数用意されています。
pystrayをインストールしていない場合は、シェルまたはコマンドプロンプトで以下のコマンドを実行してください。
pip install pystray
実装の手順
システムトレイアイコンを作成する際は、以下の手順に従います。
必要なライブラリをインポートする ― pystray、Pythonの画像処理ライブラリPIL(Pillow)。
ウィンドウを非表示にし、アイコンをシステムトレイに登録する関数hide_window()を定義する。
メニュー項目として「Show(表示)」と「Quit(終了)」の2つを追加・定義する。
ShowとQuitそれぞれの動作を担う関数を定義し、メニュー項目にコマンドとして割り当てる。
サンプルコード
# 必要なライブラリをインポート
from tkinter import *
from pystray import MenuItem as item
import pystray
from PIL import Image, ImageTk
# tkinterのフレーム(ウィンドウ)のインスタンスを作成
win=Tk()
win.title("System Tray Application")
# ウィンドウサイズを設定
win.geometry("700x350")
# ウィンドウを終了する関数を定義
def quit_window(icon, item):
icon.stop()
win.destroy()
# ウィンドウを再表示する関数を定義
def show_window(icon, item):
icon.stop()
win.after(0,win.deiconify())
# ウィンドウを非表示にし、システムトレイに表示する
def hide_window():
win.withdraw()
image=Image.open("image.ico")
menu=(item('Quit', quit_window), item('Show', show_window))
icon=pystray.Icon("name", image, "title", menu)
icon.run()
win.protocol('WM_DELETE_WINDOW', hide_window)
win.mainloop()実行結果
上記のコードを実行すると、ウィジェットや要素を含んだアプリケーションウィンドウが画面に表示されます。

この状態でウィンドウを閉じると、アプリは終了せず、タスクバーの通知領域(システムトレイ)にアイコンとして表示されます。トレイアイコンを右クリックすると「Show」でウィンドウを再表示、「Quit」でアプリを完全に終了できるため、バックグラウンドで動作し続ける常駐型アプリケーションを簡単に実現できます。
-
Tkinterでテキストウィジェットを読み取り専用(無効化)にする方法
Tkinterでは、テキストウィジェットを無効化(disabled)したいケースがあります。これを実現するには、テキストウィジェットの state オプションを DISABLED に設定します。こうすることでテキストウィジェットがフリーズし、読み取り専用の状態になります。この記事では、テキストウィジェットとボタンを作成し、ボタンをクリックするとテキストウィジェットを即座に無効化できるサンプルを紹介します。コード例# ライブラリのインポート from tkinter import * # ウィンドウのインスタンスを作成 win = Tk() # ウィンドウのサイズを設定 win.geomet
-
Python Tkinterでルートウィンドウを非表示・破棄する2つの方法
Tkinterアプリケーションのテスト中に、デフォルトのウィンドウやフレームを一時的に隠したい、あるいは完全に閉じたいという場面に遭遇することがあります。Tkinterでは、withdraw()メソッドによる「非表示」と、destroy()メソッドによる「破棄」の2つのアプローチが用意されています。mainloop()とウィンドウのライフサイクルmainloop()は、外部イベントによってウィンドウが閉じられるまで、Tkinterアプリケーションを実行し続ける役割を担います。このメインループが動作している間、ウィンドウは画面上に表示され続けます。ウィンドウを完全に破棄(終了)したい場合は、de