使用 Pystray 库。我正在尝试组装一个按钮数组,每个按钮都应将其设备的索引传递给函数以将其设置为默认设备,但由于未知的原因,当我单击任何按钮时,仅返回最后一个索引。在我的例子中,3个麦克风的索引是4 5 6,无论我按哪个按钮,都会选择索引6。
menu_items = []
for device in only_recording_devices:
index = device[0][-1]
is_default = device[1].split('Default : ')[1]
name = device[4].split("Name : ")[1]
menu_items.append(MenuItem(f"{index} - {name}", lambda _: set_default_microphone(index),
radio=True))

这称为“变量闭包”。当调用any时
lambda,其中的值index是最后分配给该变量的值。因为lambda传递的是变量的地址,而不是它的值。为了确保正确“记住”该值,请使用带参数的 lambda 表示法形式。看起来很奇怪,但应该可以。在这种情况下,变量的值index将被“记住”在 lambda 的参数中,并且当调用该 lambda 时,将使用该变量的正确值(因为它已经是 lambda 的内部变量index,并且不是 lambda 引用的外部变量index,尽管变量的名称看起来是相同的)。更新:这个 lambda 还需要一个
_您没有使用的参数,但它是必需的,因为它是一个事件处理程序。你有它,但我先把它删除了,现在又把它加回来了。Update2:添加代码来说明问题。正如 Grundy 在评论中所写,每次迭代的变量都是不同的,但 lambda 只记住最后一个。我无法完全解释为什么会这样。
演示问题并测试
id变量的代码:结论:
更正的代码:
结论:
最有可能的是,lambda 中的 Python 甚至不记得变量的链接,而只记住它的名称。