本文由 简悦 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 进程结束,就关闭托盘图标,防止关不掉图标。
现在我们点关闭按钮,程序直接就被停止了,但要我们要实现点击关闭按钮,并不是真正关闭程序而是最小化,点击托盘图标又可以重新进入程序。主要完成这两步就可以实现了:
- 通过注册 win.protocol() 注册 WM_DELETE_WINDOW 命令,在回调函数中执行 win.withdraw() 从而实现关闭窗口界面。
- 给托盘图标的菜单添加 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()
原文链接
Comments | NOTHING