Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

tkinterでタスクトレイに常駐させたいそこのあなた。諦めてwxPythonを使って幸せになろう

More than 1 year has passed since last update.

概要

まぁtkinterに固執してたのは私なんですが。

パッケージを追加したくないという理由でtkinterにこだわってタスクトレイに常駐させる方法を探してましたが、どうにも無理そうだったのでwxPythonを使ってみたところあっさりうまくいきました。

まだtkinterで作り込んでいないならサクッと切り替えることをおすすめします。

環境

Windows7 64bit
Python 3.6.5
wxPython==4.0.2

準備

パッケージインストール

pip install wxPython

実データ

フォルダ構成

root/
 ├ gui.py
 ├ main.py
 ├ logo.ico # 今回はgoogleのGマークにしました

コード

gui.py

import wx
import wx.adv

TRAY_TOOLTIP = 'test app'
TRAY_ICON = 'logo.ico'

def create_menu_item(menu, label, func):
    item = wx.MenuItem(menu, -1, label)
    menu.Bind(wx.EVT_MENU, func, id=item.GetId())
    menu.AppendItem(item)

    return item

def open_site():
    print("open site.")
    pass
    # import webbrowser
    # webbrowser.open_new(r"https://www.google.com/")


class TaskBarIcon(wx.adv.TaskBarIcon):

    def __init__(self, frame):
        self.frame = frame
        super(TaskBarIcon, self).__init__()
        self.set_icon(TRAY_ICON)
        self.Bind(wx.adv.EVT_TASKBAR_LEFT_DCLICK, self.on_open_site)

    def CreatePopupMenu(self):
        menu = wx.Menu()
        create_menu_item(menu, 'Open Site', self.on_open_site)
        menu.AppendSeparator()
        create_menu_item(menu, 'Exit', self.on_exit)

        return menu

    def set_icon(self, path):
        icon = wx.Icon(wx.Bitmap(path))
        self.SetIcon(icon, TRAY_TOOLTIP)

    def on_open_site(self, event):
        open_site()

    def on_exit(self, event):
        print('exit')
        wx.CallAfter(self.Destroy)
        self.frame.Close()


class App(wx.App):

    def OnInit(self):
        frame=wx.Frame(None)
        self.SetTopWindow(frame)
        TaskBarIcon(frame)

        print('launch App')
        return True

main.py

if __name__ == "__main__":
    import gui
    app = gui.App(False)
    app.MainLoop()

結果

tasktray.gif

余談

windowsの右下の領域は日本語でタスクトレイ、通知領域、はたまた英語ではsystem tray、task trayなどと呼ばれるので、その呼び名 x パッケージの数だけ検索をかけないと最適解が得られないのはなかなかに辛い。

参考

https://stackoverflow.com/questions/6389580/quick-and-easy-trayicon-with-python

toriiico
広く浅くなwebエンジニア
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away