在 python 和 tkinter 中使用 pystray 来创建托盘图标


本文由 简悦 SimpRead 转码, 原文地址 zhuanlan.zhihu.com

pystray 是一个简单的、跨平台的,用于创建系统托盘图标的第三方库。 本篇文章主要讲解 pystray 在 win 平台下使用,如果有跨平台或兼容性上问题,可以去官方仓库提问。

安装

pip install pystray

基本使用

我们先简单创建一个图片,设置下右键菜单,点击菜单看看效果。

import pystray
from PIL import Image
from pystray import MenuItem

menu = (MenuItem('菜单1', lambda: print("点击了菜单1")), MenuItem('菜单2', lambda: print("点击了菜单2")))
image = Image.open("static/img.png")
icon = pystray.Icon("name", image, "鼠标移动到\n托盘图标上\n展示内容", menu)
icon.run()

菜单和通知使用说明

这里演示了菜单和通知的使用方法。通过设置 MenuItem 不同属性实现不同功能,设置 default=True 则点击托盘图标时执行,visible 属性设置是否可见,enabled 设置菜单是否可用。

icon.notify() 可以发起一个通知消息。效果见下图。

import pystray
from PIL import Image
from pystray import MenuItem

def click_menu(icon, item):
    print("点击了", item)

def on_exit(icon, item):
    icon.stop()

def notify(icon: pystray.Icon):
    icon.notify("我是消息类容", "消息标题")

menu = (MenuItem(text='菜单1', action=click_menu), MenuItem(text='菜单2', action=click_menu),
        MenuItem(text='菜单3', action=click_menu, enabled=False),
        MenuItem(text='发送通知', action=notify),
        MenuItem(text='我是点击图标的菜单', action=click_menu, default=True, visible=False),
        MenuItem(text='退出', action=on_exit),
        )
image = Image.open("static/img.png")
icon = pystray.Icon("name", image, "鼠标移动到\n托盘图标上\n展示内容", menu)
icon.run()

结合 tkinter 同时展示托盘图标和界面

这里简单演示一下,在 tkinter 中展示托盘图标。

直接执行 icon.run() 方法,会发现图标出现了,但是界面不出来,这是因为 icon.run() 会阻塞进入事件循环,处理办法很简单,开一个线程就行了。

这里需要主要,需要设置 daemon=True 将线程设置为守护线程,使 tkinter 进程结束,就关闭托盘图标,防止关不掉图标。

现在我们点关闭按钮,程序直接就被停止了,但要我们要实现点击关闭按钮,并不是真正关闭程序而是最小化,点击托盘图标又可以重新进入程序。主要完成这两步就可以实现了:

  1. 通过注册 win.protocol() 注册 WM_DELETE_WINDOW 命令,在回调函数中执行 win.withdraw() 从而实现关闭窗口界面。
  2. 给托盘图标的菜单添加 default=True 这个属性,定义点击托盘图标的默认事件,在回调中调用 win.deiconify() 就能重新打开窗口。

tkinter 结合 pystray 的演示代码

import threading
from tkinter import Tk

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

def quit_window(icon: pystray.Icon):
    icon.stop()
    win.destroy()

def show_window():
    win.deiconify()

def on_exit():
    win.withdraw()

menu = (MenuItem('显示', show_window, default=True), Menu.SEPARATOR, MenuItem('退出', quit_window))
image = Image.open("static/img.png")
icon = pystray.Icon("icon", image, "图标名称", menu)
win = Tk()
win.geometry("500x300")

# 重新定义点击关闭按钮的处理
win.protocol('WM_DELETE_WINDOW', on_exit)

threading.Thread(target=icon.run, daemon=True).start()

win.mainloop()

原文链接

Python 使用 pystray 库实现托盘图标

声明:HEUE NOTE|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA 4.0协议进行授权

转载:转载请注明原文链接 - 在 python 和 tkinter 中使用 pystray 来创建托盘图标