0

我有一个 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 测试的示例)

4

1 回答 1

2

这里不需要使用跟踪,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()
于 2021-01-23T22:28:41.753 回答