V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lon91ong
V2EX  ›  Python

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

  •  
  •   lon91ong · 2022-04-25 16:54:48 +08:00 · 2039 次点击
    这是一个创建于 975 天前的主题,其中的信息可能已经有所发展或是发生改变。

    测试源代码如下:

    # -*- 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参见

    第 1 条附言  ·  2022-04-25 19:12:28 +08:00

    问题完美解决, 但是有点不太明白原理, 问题详情 问题还原:

    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)))
    

    模糊理解, 不太明白, 希望大侠释疑

    2 条回复    2022-04-25 19:10:54 +08:00
    imn1
        1
    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
        2
    lon91ong  
    OP
       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)))
    ```
    模糊理解, 不太明白, 希望大侠释疑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5474 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 07:20 · PVG 15:20 · LAX 23:20 · JFK 02:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.