You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:06:06