如何在Pystray菜单调用回调函数时传递多个自定义参数
问题根源
你当前的写法会在构造Menu时直接执行quit_window函数,拿到的返回值(None)会被当作回调传入MenuItem,而不是将函数本身作为回调绑定。同时此时icon变量存储的是图标文件路径字符串,还未初始化为pystray.Icon实例,自然无法正确调用stop()方法。
解决方案
下面两种常用方案都可以实现自定义参数传递,不需要调整Icon和Menu的创建顺序:
方案1:使用lambda匿名函数包装(最简便)
利用lambda接住pystray自动传入的icon实例,再调用自定义函数传入额外参数:
import pystray from pystray import MenuItem as item from PIL import Image def show_window(icon): icon.notify('Hello World!', 'Hi') def quit_window(icon, message): print(message) icon.stop() icon_path = 'icon.ico' image = Image.open(icon_path) # 用lambda包装回调,点击时才会执行quit_window menu = pystray.Menu( item('Show', show_window, default=True), item('Quit', lambda icon: quit_window(icon, "Test")) ) icon = pystray.Icon("name", image, "My System Tray Icon", menu) icon.run()
方案2:使用functools.partial偏函数固定参数
适合参数较多、需要复用回调的场景:
import pystray import functools from pystray import MenuItem as item from PIL import Image def show_window(icon): icon.notify('Hello World!', 'Hi') def quit_window(icon, message): print(message) icon.stop() icon_path = 'icon.ico' image = Image.open(icon_path) # 用partial固定第二个参数message的值 menu = pystray.Menu( item('Show', show_window, default=True), item('Quit', functools.partial(quit_window, message="Test")) ) icon = pystray.Icon("name", image, "My System Tray Icon", menu) icon.run()
两种方案运行后点击Quit菜单,都会正常打印Test并退出托盘程序。
内容的提问来源于stack exchange,提问作者JonLord
相关产品推荐
相关产品推荐

