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

使用pystray的update_menu()动态修改菜单项文本失败求助

动态修改pystray菜单项文本的解决方法

你的问题出在初始化菜单时,菜单项的text直接使用了adapter变量的初始值,后续修改adapter只是改变了变量本身,并不会同步更新已创建的菜单项文本。update_menu()方法仅负责刷新菜单的显示,但不会重新计算静态设置的文本内容。

要实现动态更新,需要让菜单项的text指向一个可调用对象(无参数函数),这样每次菜单渲染时都会调用该函数获取最新的文本值,再配合update_menu()完成刷新。

修改后的代码如下:

from pystray import Icon as icon, Menu as menu, MenuItem as item
import PIL.Image

image = PIL.Image.new('RGB', (100, 100), 255)

adapter = 'before'

def test():
    global ps
    global adapter
    adapter = 'after'
    ps.update_menu()  # 刷新菜单,触发文本重新获取

# 定义动态获取文本的函数
def get_adapter_text():
    return adapter

ps = icon(name='name', icon=image, menu=menu(
        item(text='Adapter', action=menu(item(text='Test', action=test))),
        # 将text设置为可调用对象,而非静态字符串
        item(text=get_adapter_text, action=lambda: test()),
        )
    )
ps.run()

也可以简化为直接使用lambda表达式:

item(text=lambda: adapter, action=lambda: test()),

这样点击Test按钮后,adapter变量更新为'after',调用update_menu()会让菜单重新调用对应函数获取最新文本,菜单项内容就会同步更新了。

内容的提问来源于stack exchange,提问作者John332

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 21:15:00