Python/Tkinter技术问题:点击复选框无法获取变量当前值,仅返回旧值
Tkinter复选框打印旧值问题排查与解决
问题根源:你绑定的<ButtonRelease>事件触发时机早于Tkinter更新复选框关联变量的时机,所以打印的是点击操作前的旧值。
解决方法一:使用Checkbutton自带的command参数(推荐)
Checkbutton的command回调会在复选框状态更新、关联变量同步完成后执行,能准确获取最新值:
import tkinter as tk def widget(frame): chbx_value = 0 widget_col_span = 1 var_c = tk.IntVar(master=frame, value=chbx_value) def on_check_change(): print(var_c.get()) widget_c = tk.Checkbutton(master=frame, text='', variable=var_c, command=on_check_change) widget_c.grid(row=0, column=0, columnspan=widget_col_span, padx=1, pady=1, sticky="ns") root = tk.Tk() root.title('My Window') widget(root) root.mainloop()
解决方法二:延迟执行打印操作(适配必须用事件绑定的场景)
如果一定要保留事件绑定,可以通过after_idle让打印操作在Tkinter完成所有界面更新后执行:
import tkinter as tk def widget(frame): chbx_value = 0 widget_col_span = 1 var_c = tk.IntVar(master=frame, value=chbx_value) def print_latest_value(event): frame.after_idle(lambda: print(var_c.get())) widget_c = tk.Checkbutton(master=frame, text='', variable=var_c) widget_c.bind("<ButtonRelease>", print_latest_value) widget_c.grid(row=0, column=0, columnspan=widget_col_span, padx=1, pady=1, sticky="ns") root = tk.Tk() root.title('My Window') widget(root) root.mainloop()
内容的提问来源于stack exchange,提问作者drSlump
相关产品推荐
相关产品推荐

