我有一个 tkinter 应用程序,ttk.OptionMenu
其值设置为 a 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 测试的示例)