0

我正在尝试将额外的参数传递给由 pystray 菜单中的项目调用的函数。

import pystray
from pystray import MenuItem as item
from PIL import Image, ImageTk

def show_window(icon):
    icon.notify('Hello World!', 'Hi')


def quit_window(icon, message):
    print(message)
    icon.stop()


icon = 'icon.ico'
image=Image.open(icon)

menu=pystray.Menu(item('Show', show_window, default=True), item('Quit', quit_window(icon, "Test")))
icon=pystray.Icon("name", image, "My System Tray Icon", menu)
icon.run()

在此示例中,当我在 pystray 菜单中按“退出”时,我试图传递参数“消息”调用函数“quit_window”。这里的问题是默认情况下菜单构造中使用的函数没有参数,并且在内部引用图标。当我使用参数时,构造函数不会将图标引用传递给调用 stop() 并且由于我在 pystray.Menu 之后创建 pystray.Icon 我不知道如何传递此信息并使其工作。

4

1 回答 1

1

你可以做一些你似乎想做但不是那样的事情。

item() 接受一个函数(例如show_window,注意没有括号)而不是像您使用的函数调用quit_window(icon,message)- 但是如果您让被调用的函数返回一个函数,那么它将间接执行您想要的操作,尽管消息在编译时是固定的。

或者你可以让函数使用全局来获取它打印的消息,这有点可怕,但意味着消息是运行时可更改的。或者你可以对一个至少不使用显式全局的类做一些事情。

无论如何,这些方法都显示在这里(我将所有这些引用重命名为,icon因为它令人困惑):

import pystray
from pystray import MenuItem as item
from PIL import Image, ImageTk

def show_window(icon1):
    icon1.notify('Hello World!', 'Hi')

globalmessage = "A global quit message"

def quit_window(icon2):
    icon2.stop()

def indirect_quit_window(icon2,message):
    print( f"The message on quit will be '{message}'" )
    def realquitfunction(icon2):
        print( message )
        icon2.stop()
    return realquitfunction


def global_quit(icon4):
    global globalmessage
    print( globalmessage )
    icon4.stop()

icon = 'icon.ico'
image=Image.open(icon)

menu=pystray.Menu(item('Show', show_window, default=True), item('Quit', indirect_quit_window(icon, "Quitting now - bye!")),item('Global Quit', global_quit) )

icon3=pystray.Icon("name", image, "My System Tray Icon", menu)
icon3.run()

启动然后单击退出时的输出:

The message on quit will be 'Quitting now - bye!'
Quitting now - bye!

启动然后单击全局退出时的输出:

The message on quit will be 'Quitting now - bye!'
A global quit message
于 2021-11-26T13:32:44.583 回答