pywin10
基于pywin32,封装了菜单,通知功能.可以搭配tkinter,方便使用.
pip install pywin10
import threading
import tkinter
import win32gui
from pywin10 import TaskBarIcon
class MainWindow:
def __init__(self):
self.root = tkinter.Tk()
# 开启常驻后台线程
backend_thread = threading.Thread(target=self.backend)
backend_thread.setDaemon(True)
backend_thread.start()
# 设置当点击窗体时弹出通知
self.root.bind('<ButtonPress-1>', self._on_tap)
# 自定义关闭按钮
self.root.protocol("WM_DELETE_WINDOW", self._close)
self.root.mainloop()
def _on_tap(self, event):
self.t.ShowToast()
def _close(self):
self.t.ShowToast(title="最小化", msg="窗口已经最小化到图标")
self.root.withdraw()
def _show(self):
self.root.deiconify()
def ding(self, *args):
print("ding 接收参数:", args)
def _left_click(self, *args):
print("_left_click 接收参数:", args)
def exit(self):
# 退出 TaskBarIcon
win32gui.DestroyWindow(self.t.hwnd)
# 退出 Tkinter
self.root.destroy()
def backend(self):
# TaskBarIcon 里面的参数全部都不是必须的,即便self.t = TaskBarIcon(),你一样可以发送通知等.
self.t = TaskBarIcon(
left_click=(self._left_click, (1, 2)), # 左键单击回调函数,可以不设置(如果想要传参,这样写(func,(arg1,arg2)))
double_click=self._show, # 左键双击回调函数,可以不设置(如果不想传参,直接写函数名称)
icon="python.ico", # 设置图标,可以不设置
hover_text="TaskBarIcon", # 设置悬浮在小图标显示的文字,可以不设置
menu_options=[ # 可以不设置
['退出', "退出.ico", self.exit, 1], # 菜单项格式:["菜单项名称","菜单项图标路径或None",回调函数或者子菜单列表,id数字(随便写不要重复即可)]
["分隔符", None, None, 111],
['顶一顶', "ding.ico", (self.ding, (1, 2, 3)), 44],
['日历', "日历.ico", None, 3],
['主页', "主页.ico", self._show, 2],
["分隔符", None, None, 7],
["更多选项", "编辑.ico", [
['使用说明', "等待文件.ico", None, 25],
["分隔符", None, None, 17],
['hello', "github.ico", None, 16],
['hello2', "github.ico", None, 1116],
], 4],
],
menu_style="iconic", # 设置右键菜单的模式,可以不设置:normal(不展示图标),iconic(展示图标)
icon_x_pad=12, # 设置图标左边距
)
# 注意这是死循环,类似与tkinter中的mainloop,
# 因为都是死循环,所以与mainloop会冲突,放到线程里面执行.
win32gui.PumpMessages()
if __name__ == '__main__':
MainWindow()