GUI 点击响应函数的参数传递问题

2022-04-25 16:54:48 +08:00
 lon91ong

测试源代码如下:

# -*- coding: utf-8 -*-

from os import path
from time import sleep
from winsystray import SysTrayIcon
from winsystray.win32_adapter import NIIF_USER, NIIF_LARGE_ICON, MFS_DISABLED

app_root = path.dirname(path.realpath(__file__))

def on_right_click(systray):
    build_menu(systray)
    systray._show_menu()

def on_quit(systray):
    global running
    running = False

def on_select(systray):
    '''
    这里怎么知道点击的是哪个菜单呢?

    '''
    
def build_menu(systray):
    global last_main_menu, labs
    
    #print(labs.values())
    main_menu = []
    for k in labs.keys():
        main_menu.append((k, 'pass', MFS_DISABLED))
        for j in labs[k]:
            main_menu.append(('   '+j['Name'], on_select)) # 这里的响应函数怎么传参数呢? 
        main_menu.append((None, '-'))
    main_menu.append((None, '-'))
    main_menu = tuple(main_menu)
    if main_menu != last_main_menu:
        systray.update(menu=main_menu)
        last_main_menu = main_menu

def balloons_info(text, title='通知'):
    my_tray.show_balloon(text, title, NIIF_USER | NIIF_LARGE_ICON)
    
last_main_menu = None
labs={'Sort 1':[{'Name':'Jack', 'Args':'8866'},{'Name':'Bob', 'Args':'9900'}],'Sort 2':[{'Name':'Jams', 'Args':'8686'},{'Name':'John', 'Args':'9090'}]} 
quit_item = '退出', on_quit
icon_pth = path.join(app_root, 'favicon.ico')
my_tray = SysTrayIcon(icon_pth, '测试响应', None, quit_item,
                            left_click=None, right_click=on_right_click)
my_tray.start()

sleep(0.1)
balloons_info('响应测试已经启动。\n\n 右键选择菜单')
running = True
while running:
    sleep(2)

效果如图所示

###问题是

响应函数如何接收参数呢? 或者 响应函数怎么知道点击的是哪个菜单呢?

引用的库 winsystray参见

1877 次点击
所在节点    Python
2 条回复
imn1
2022-04-25 17:14:05 +08:00
不熟悉 winsystray 包的人,应该很难准确回答,还需要你自行确认用法

单纯看 git issue 的话,main_menu.append 第二个参数是 callabled ,传一个 function 过去?
是这样的话,你可以使用 functools.partial 定义一个指定参数的 function 作为传递
on_select 添加这个参数名称则可


def on_select( ..., item):
...
for ...
func = functools.partial(on_select, item=某个 id)
main_menu.append( (..., func))
lon91ong
2022-04-25 19:10:54 +08:00
问题完美解决, 但是有点不太明白原理, [问题详情]( https://github.com/SeaHOH/GotoX/discussions/228)
问题还原:
```
main_menu.append((' '+j['Name'],lambda x: subOpen(SomeWeb_app+' '+j['Args'])))
```
问题解决:
```
main_menu.append((' '+j['Name'],lambda x, arg=j['Args']: subOpen(SomeWeb_app+' '+arg)))
```
模糊理解, 不太明白, 希望大侠释疑

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/849198

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX