有没有办法防止 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()
我有一个带有 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()