有没有办法防止 ttk OptionMenu 回调触发两次?

Is there a way to prevent a ttk OptionMenu callback from firing twice?

我有一个带有 ttk.OptionMenu 的 tkinter 应用程序,其值设置为 tk.StringVar。每当用户在选项菜单中选择一个新选项时,我都想得到一个回调。在 StringVar 上注册回调后,每当用户更改选项菜单选择时,都会触发回调两次。有什么方法可以在用户更改菜单时恰好触发一次回调?

这是完整的(可运行的)示例:

import tkinter as tk
from tkinter import ttk


OPTIONS = ["A", "B", "C"]

# Set up a new window
root = tk.Tk()

# Create a variable
option_var = tk.StringVar()

# Register a callback that fires when the variable is changed
option_var.trace("w", lambda *args: print("option_var is", option_var.get(), "with args", args))

# Create the OptionMenu and add it to the GUI root
ttk.OptionMenu(root, option_var, OPTIONS[0], *OPTIONS).pack()

# Run the application
root.mainloop()

正如预期的那样,在启动时,回调会触发一次以反映对默认变量的更改:

option_var is A with args ('PY_VAR0', '', 'w')

但是,如果用户单击下拉菜单并选择 B,回调将触发两次。

option_var is B with args ('PY_VAR0', '', 'w')
option_var is B with args ('PY_VAR0', '', 'w')

有没有办法设置回调,使其仅在选项菜单更改时触发一次?或者,是否有某种方法可以将这些回调中的一个与另一个分开,以便我可以在每次菜单更改时执行一次操作?

(在 Windows 10 1809 上使用 CPython 3.6.8 运行 测试的示例)

这里不用trace,Optionmenu有命令参数:

import tkinter as tk
from tkinter import ttk

OPTIONS = ["A", "B", "C"]

root = tk.Tk()

def callback(value):
    print("option_var is", value)

option_var = tk.StringVar()
ttk.OptionMenu(root, option_var, OPTIONS[0], *OPTIONS, command=callback).pack()

root.mainloop()