Python_PyStray结合Tkinter显示系统托盘图标
前言
PyStray 是一个用于 Python 的系统托盘图标库,它可以让您轻松地在 Windows、macOS 和 Linux 下创建和管理托盘图标应用程序。通过 PyStray,您可以创建自定义托盘图标、菜单和气泡通知,并响应托盘图标的各种事件。
PyStray 的主要特点包括:
- 跨平台支持:支持 Windows、macOS 和 Linux。
- 使用简单:易于安装、配置和使用。
- 自定义菜单:支持创建复杂的上下文菜单,并具有灵活的菜单项数据结构。
- 气泡通知功能:支持显示定制的气泡通知,包括标题、消息、图标以及可选的声音。
- 自定义图标:支持使用各种格式的图像文件作为托盘图标,包括 PNG、ICO、JPEG 和 GIF 等。
- 事件处理:支持处理托盘图标的各种事件,例如鼠标单击、双击和右键菜单。
一、使用
- 创建托盘图标,并显示菜单
import pystray # 导入 PyStray 库
from PIL import Image # 导入 PIL 库中的 Image 模块
def on_quit_clicked(icon): # 自定义回调函数
icon.stop() # 对象停止方法
# 创建图标对象
image = Image.open("ICO.ico") # 打开 ICO 图像文件并创建一个 Image 对象
menu = (pystray.MenuItem(text='退出', action=on_quit_clicked),) # 创建菜单项元组
icon = pystray.Icon("name", image, "托盘名称", menu) # 创建 PyStray Icon 对象,并传入关键参数
# 显示图标
icon.run() # 启动托盘图标目录
2.创建托盘图标,显示多个菜单,并显示气泡通知
- default=True则点击托盘图标时执行
- visible属性设置是否可见
- enabled设置菜单是否可用
import pystray # 导入 PyStray 库
from PIL import Image # 导入 Python Imaging Library 的 Image 类
# 定义点击菜单项的回调函数
def click_menu(icon, item):
print("点击了", item)
# 定义退出菜单项的回调函数
def on_exit(icon, item):
icon.stop()
# 定义通知内容的回调函数
def notify(icon: pystray.Icon):
icon.notify(title="通知标题", message="通知内容")
# 创建菜单项
menu = (
pystray.MenuItem('菜单A', click_menu), # 第一个菜单项
pystray.MenuItem('菜单B', click_menu), # 第二个菜单项
pystray.MenuItem(text='菜单C', action=click_menu, enabled=False), # 第三个菜单项
pystray.MenuItem(text='发送通知', action=notify), # 第四个菜单项
pystray.MenuItem(text='点击托盘图标显示', action=click_menu, default=True, visible=False), # 第五个菜单项
pystray.MenuItem(text='退出', action=on_exit), # 最后一个菜单项
)
# 创建图标对象
image = Image.open("ICO.ico") # 打开并读取图片文件
icon = pystray.Icon("name", image, "鼠标移动到\n托盘图标上\n展示内容", menu) # 创建图标对象并绑定菜单项
# 显示图标并等待用户操作
icon.run()
二、结合Tkinter使用
import threading
import tkinter as tk
import pystray
from PIL import Image
class GUI:
def __init__(self):
self.root = tk.Tk()
self.root.title('演示窗口')
self.root.geometry("500x200+1100+150")
# 当用户点击窗口右上角的关闭按钮时,Tkinter 将自动发送 WM_DELETE_WINDOW 关闭事件。通过对其进行处理并调用 self.hide_window() 方法,可以改为将窗口隐藏到系统托盘中。
# 该方法用于将程序窗口隐藏到系统托盘中而非直接退出应用程序
self.root.protocol('WM_DELETE_WINDOW', self.hide_window)
# 添加菜单和图标
self.create_systray_icon()
# 绘制界面
self.interface()
def interface(self):
""""界面编写位置"""
pass
def create_systray_icon(self):
"""
使用 Pystray 创建系统托盘图标
"""
menu = (
pystray.MenuItem('显示', self.show_window, default=True),
pystray.Menu.SEPARATOR, # 在系统托盘菜单中添加分隔线
pystray.MenuItem('退出', self.quit_window))
image = Image.open("ICO.ico")
self.icon = pystray.Icon("icon", image, "图标名称", menu)
threading.Thread(target=self.icon.run, daemon=True).start()
# 关闭窗口时隐藏窗口,并将 Pystray 图标放到系统托盘中。
def hide_window(self):
self.root.withdraw()
# 从系统托盘中恢复 Pystray 图标,并显示隐藏的窗口。
def show_window(self):
self.icon.visible = True
self.root.deiconify()
def quit_window(self, icon: pystray.Icon):
"""
退出程序
"""
icon.stop() # 停止 Pystray 的事件循环
self.root.quit() # 终止 Tkinter 的事件循环
self.root.destroy() # 销毁应用程序的主窗口和所有活动
if __name__ == '__main__':
a = GUI()
a.root.mainloop()
2024-03-27 15:03:10【出处】:https://blog.csdn.net/qq_45664055/article/details/130464922
=======================================================================================
个人使用
我自己根据上面的内容,自行修改了一下。
需求:程序开始运行时自动隐藏当前窗口,通过菜单控制当前界面的显示与隐藏,其他的功能自己就自由发挥扩展吧!~
版本1
#!/usr/bin/env python3 #imgPath="pythonx50.png" #image = Image.open(imgPath) import pystray # 导入 PyStray 库 #from PIL import Image # 导入 Python Imaging Library 的 Image 类 import PIL.Image import win32gui class notifyIco: # 定义点击菜单项的回调函数 def click_menu(s,icon, item): print("点击了", item) def on_Show(s): win32gui.ShowWindow(hwnd, 1) def on_Hid(s): win32gui.ShowWindow(hwnd, 0) # 定义退出菜单项的回调函数 def on_exit(s,icon, item): icon.stop() # 定义通知内容的回调函数 def notify(s,icon: pystray.Icon): icon.notify(title="通知标题", message="通知内容") def run(s): # 创建菜单项 menu = ( pystray.MenuItem('显示', s.on_Show), # 第一个菜单项 pystray.MenuItem('隐藏', s.on_Hid), # 第二个菜单项 pystray.MenuItem(text='菜单C', action=s.click_menu), # 第三个菜单项 pystray.MenuItem(text='发送通知', action=s.notify, enabled=False), # 第四个菜单项 pystray.MenuItem(text='点击托盘', action=s.click_menu, default=True,visible=False), # 第五个菜单项,验证visible pystray.MenuItem(text='退出', action=s.on_exit), # 最后一个菜单项 ) # 创建图标对象 imgPath="pythonx50.png" #imgPath="pyProject.ico" img = PIL.Image.open(imgPath) # 打开并读取图片文件 #icon = pystray.Icon("name", img, "鼠标移动到\n托盘图标上\n展示内容", menu) # 创建图标对象并绑定菜单项 icon = pystray.Icon('Double-click Example', img,"鼠标移动到\n托盘图标上\n展示内容", menu) #此处的图标对象不支持字符串路径格式 # 显示图标并等待用户操作 icon.run() global hwnd if __name__ == '__main__': #hwnd = win32console.GetConsoleWindow() hwnd = win32gui.GetForegroundWindow() #win32gui.ShowWindow(hwnd, 0) icoMng = notifyIco() icoMng.run()
版本2
#!/usr/bin/env python3 #imgPath="pythonx50.png" #image = Image.open(imgPath) import pystray # 导入 PyStray 库 #from PIL import Image # 导入 Python Imaging Library 的 Image 类 import PIL.Image import win32gui class notifyIco: # 定义点击菜单项的回调函数 def click_menu(s,icon, item): print("点击了", item) def on_Show(s): win32gui.ShowWindow(hwnd, 1) def on_Hid(s): win32gui.ShowWindow(hwnd, 0) # 定义退出菜单项的回调函数 def on_exit(s,icon, item): icon.stop() # 定义通知内容的回调函数 def notify(s,icon: pystray.Icon): icon.notify(title="通知标题", message="通知内容") def __init__(s, imgFilePath, menuArr=None): s.imgPath=imgFilePath s.img = PIL.Image.open(s.imgPath) s.menuList=tuple() for i, val in enumerate(menuArr): s.menuList += (pystray.MenuItem(val[0],val[1]),) #s.menuList += (pystray.MenuItem(val[0],val[1]),) for item in menuArr def addMenu(s,mentText,handFun,visible=True,default=False): s.menuList += (pystray.MenuItem(mentText, handFun, visible=visible, default=default),) #s.menuList += (pystray.MenuItem(text=mentText, action=handFun,visible=visible,default=default),) def runTest(s): # 创建菜单项 menu = ( pystray.MenuItem('显示', s.on_Show), # 第一个菜单项 pystray.MenuItem('隐藏', s.on_Hid), # 第二个菜单项 pystray.MenuItem(text='菜单C', action=s.click_menu), # 第三个菜单项 pystray.MenuItem(text='发送通知', action=s.notify, enabled=False), # 第四个菜单项 pystray.MenuItem(text='点击托盘', action=s.click_menu, default=True,visible=False), # 第五个菜单项,验证visible pystray.MenuItem(text='退出', action=s.on_exit), # 最后一个菜单项 ) # 创建图标对象 imgPath="pythonx50.png" #imgPath="pyProject.ico" img = PIL.Image.open(s.imgPath) # 打开并读取图片文件 #icon = pystray.Icon("name", img, "鼠标移动到\n托盘图标上\n展示内容", menu) # 创建图标对象并绑定菜单项 icon = pystray.Icon('Double-click Example', img,"鼠标移动到\n托盘图标上\n展示内容", s.menuList) #此处的图标对象不支持字符串路径格式 # 显示图标并等待用户操作 icon.run() def run(s): s.menuList += (pystray.MenuItem(text='退出', action=s.on_exit),) print(s.menuList) icon = pystray.Icon('Double-click Example', s.img,"鼠标移动到\n托盘图标上\n展示内容", s.menuList) #此处的图标对象不支持字符串路径格式 icon.run() class uiMenage: def __init__(s): #hwnd = win32console.GetConsoleWindow() #hwnd = win32gui.GetForegroundWindow() #win32gui.ShowWindow(hwnd, 0) s.hwnd = win32gui.GetForegroundWindow() def on_Show(s): win32gui.ShowWindow(s.hwnd, 1) def on_Hid(s): win32gui.ShowWindow(s.hwnd, 0) global hwnd if __name__ == '__main__': ui=uiMenage() imgPath="pythonx50.png" #imgPath="pyProject.ico" menuItems=[('显示1', ui.on_Show),('隐藏1', ui.on_Hid)] icoMng = notifyIco(imgPath,menuItems) icoMng.addMenu('显示', ui.on_Show,default=True) icoMng.addMenu('隐藏', ui.on_Hid) icoMng.run()
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/18099346
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!