如何避免Tkinter Radiobutton在已选中状态下被点击时重复执行命令函数
这个问题我之前做小工具的时候也碰到过,Tkinter的Radiobutton确实有点“实诚”——不管它是不是已经处于选中状态,只要点它就会触发command绑定的函数。要解决这个问题其实很简单,我们只需要记录下上一次选中的选项值,每次触发函数时先做个对比:只有当当前选中的值和上次不一样的时候,才执行我们真正的逻辑。
具体实现可以参考下面修改后的代码:
import tkinter as tk def on_choice(): current_value = radiobutton_variable.get() # 对比当前值和上次记录的值,不一样才执行逻辑 if current_value != last_selected[0]: print('Function executed') # 更新上次选中的值 last_selected[0] = current_value root = tk.Tk() root.geometry('300x150') radiobutton_variable = tk.StringVar() initial_value = '1' radiobutton_variable.set(initial_value) # 用列表来保存上次选中的值(因为列表是可变对象,函数里能直接修改) last_selected = [initial_value] button_1 = tk.Radiobutton(root, text='Button 1', variable=radiobutton_variable, value='1', command=on_choice) button_2 = tk.Radiobutton(root, text='Button 2', variable=radiobutton_variable, value='2', command=on_choice) button_1.pack() button_2.pack() root.mainloop()
这里有几个关键点要说明:
- 我用了一个列表
last_selected来保存上次选中的值,因为如果用普通变量的话,在函数内部无法直接修改外部变量(除非用nonlocal或者global,用列表是更简洁的小技巧)。 - 在
on_choice函数里,先获取当前选中的radiobutton_variable的值,和last_selected里保存的旧值对比,只有不同的时候才执行业务逻辑,然后更新旧值。 - 注意我把初始值改成了字符串类型,因为
StringVar的get()方法返回的是字符串,这样对比的时候类型一致,不会出问题。
这样修改之后,你再点击已经选中的Radiobutton,函数就不会重复执行了,只有切换到另一个选项时才会触发~
备注:内容来源于stack exchange,提问作者FranticFronk
相关产品推荐
相关产品推荐

