使用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
相关产品推荐
相关产品推荐

