如何使用多个参数调用 Pystray 中的函数?

How to use multiple arguments calling a function in Pystray?

我正在尝试将额外的参数传递给由 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 我不知道如何传递此信息并使其工作。

你可以做一些你看起来想做但不喜欢做的事情。

item() 采用一个函数(如 show_window,注意没有括号)而不是像您使用的函数调用 quit_window(icon,message) - 但是如果您将被调用的函数 return 设为函数然后它会间接地做你想做的事,尽管消息在编译时是固定的。

或者您可以使该函数使用全局变量来获取它打印的消息,这有点可怕,但意味着该消息在运行时是可变的。或者你可以用 class 做一些至少不会使用显式全局的事情。

无论如何,这里显示了这些牵引方法(我将所有这些引用重命名为 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