如何仅在tkinter OptionMenu选项变更时执行函数?
默认情况下,用trace("w")绑定StringVar时,只要变量被赋值就会触发回调——哪怕新值和旧值完全一致,这就导致重复点击已选中的OptionMenu选项时,绑定的函数也会执行。要实现仅当选项真正变更时才执行函数,可以通过记录变量的历史值,在回调中对比新旧值来实现。
修改后的代码如下:
import tkinter from tkinter import * # 创建窗口------------------------------------------ window = tkinter.Tk() window.title("Window") window.geometry("800x500") #-------------------------------------------------------- # 记录上一次选中的选项 old_option = "" # 回调函数----------------------------------------------- def print_message(*args): global old_option current_option = option_selected.get() # 仅当当前选项和上一次不同时执行逻辑 if current_option != old_option: print("the option has been changed") old_option = current_option # 更新历史值 #-------------------------------------------------------- # 下拉菜单------------------------------------------ option_selected = StringVar() option_list = ["A", "B", "C"] option_selected.set(option_list[0]) old_option = option_list[0] # 初始化历史值为默认选中项 option_menu = OptionMenu(window, option_selected, *option_list) option_menu.pack() option_selected.trace("w", print_message) #-------------------------------------------------------- window.mainloop()
关键逻辑说明:
- 定义全局变量
old_option存储上一次选中的选项值,初始化时设为默认选中的选项 - 在回调函数
print_message中,先获取当前选中的current_option - 对比
current_option和old_option,只有当两者不相等时,才执行目标操作(这里是打印提示),同时更新old_option为当前值
这样就能确保只有当选项从一个值切换到另一个不同值时,才会触发函数执行,重复点击已选中的选项不会再触发。
内容的提问来源于stack exchange,提问作者greasy_beard
相关产品推荐
相关产品推荐

