Python Tkinter复选框选中后全返回False问题求助
Tkinter复选框状态始终返回False的修复方案
问题场景
使用Tkinter创建复选框选择要删除的机器,点击按钮输出状态时,无论是否选中,所有复选框状态均返回False。
错误原因
循环中创建的BooleanVar是局部变量,Python的垃圾回收机制会在循环迭代后回收这些变量,导致后续调用var.get()时无法获取真实的复选框状态,只能返回默认的False。
修复代码
核心修改是确保BooleanVar对象的引用被持续保留,这里将变量绑定到Tkinter窗口对象上,避免被垃圾回收:
import tkinter from tkinter import Label date_and_time_dictionary = {'S120': {'Setup Start Time': 'March 28, 2023 1:55 PM', 'Loaded in Program': 'March 28, 2023 1:56 PM', 'Setup End Time': 'April 5, 2023 1:24 PM', 'Pending F/A (At-risk) Start': 'April 5, 2023 1:24 PM', 'Pending F/A (At-risk) End': 'April 7, 2023 11:51 AM'}, 'S109': {'Setup Start Time': 'April 3, 2023 9:56 AM', 'Setup End Time': 'April 4, 2023 4:59 AM'}, 'S112': {'Setup Start Time': 'April 5, 2023 7:03 AM', 'Loaded in Program': 'April 5, 2023 9:31 AM', 'Setup End Time': 'April 11, 2023 8:49 AM', 'Pending F/A (At-risk) Start': 'April 11, 2023 8:49 AM'}, 'S117': {'Setup Start Time': 'April 5, 2023 1:24 PM', 'Loaded in Program': 'April 5, 2023 1:28 PM', 'No QIP Available': 'April 6, 2023 10:20 AM', 'Setup End Time': 'April 6, 2023 3:25 PM', 'Pending F/A (At-risk) Start': 'April 6, 2023 3:25 PM', 'Pending F/A (At-risk) End': 'April 10, 2023 8:11 AM'}, 'S113': {'Setup Start Time': 'April 5, 2023 12:53 PM', 'Loaded in Program': 'April 6, 2023 6:42 AM', 'No QIP Available': 'April 5, 2023 1:02 PM', 'Setup End Time': 'April 11, 2023 5:57 AM'}, 'S101': {'Setup Start Time': 'April 4, 2023 9:25 AM', 'Setup End Time': 'April 6, 2023 6:11 AM'}, 'S119': {'Setup Start Time': 'April 7, 2023 9:13 AM', 'Loaded in Program': 'April 7, 2023 10:02 AM', 'Waiting For F/A Approval': 'April 11, 2023 8:48 AM', 'Setup End Time': 'April 10, 2023 3:32 PM', 'Pending F/A (At-risk) Start': 'April 10, 2023 3:32 PM'}, 'S111': {'Setup Start Time': 'April 3, 2023 9:30 AM', 'Waiting For F/A Approval': 'April 10, 2023 6:25 AM', 'Setup End Time': 'April 10, 2023 6:32 AM'}, 'S106': {'Setup Start Time': 'April 7, 2023 9:06 AM', 'Setup End Time': 'April 11, 2023 6:14 AM', 'Pending F/A (At-risk) Start': 'April 11, 2023 6:14 AM'}} def delete_old_after_action_report_times(): # 创建Tkinter窗口 root = tkinter.Tk() root.geometry("400x300") # 创建文本组件(原代码未使用,可按需保留) text_box = tkinter.Text(root) # 添加提示文本 Label(root, text='Select which machine(s) you would like to delete?:').place(x=65, y=0) y_val = 20 # 存储复选框状态的字典 checkbox_states = {} # 遍历字典创建复选框 for key in date_and_time_dictionary.keys(): # 将BooleanVar绑定到root对象,避免被垃圾回收 var = tkinter.BooleanVar(root) chk = tkinter.Checkbutton(root, text=key, variable=var) chk.place(x=175, y=y_val) y_val += 20 # 将变量存入状态字典 checkbox_states[key] = var # 打印复选框状态的函数 def print_checkbox_states(): for key, var in checkbox_states.items(): print(f"{key}: {var.get()}") button = tkinter.Button(root, text="Print Checkbox States", command=print_checkbox_states) button.place(x=150, y=y_val+20) root.mainloop() # 调用函数测试 delete_old_after_action_report_times()
修复说明
- 创建
BooleanVar时传入root作为父对象,让Tkinter窗口保持对变量的引用,防止Python垃圾回收回收这些变量。 - 也可以通过将
checkbox_states字典定义为全局变量,或者用类来管理组件,同样能达到保留引用的效果。
验证结果
选中S120、S109、S111后点击按钮,输出如下:
S120: True S109: True S112: False S117: False S113: False S101: False S119: False S111: True S106: False
内容的提问来源于stack exchange,提问作者R3CURSION
相关产品推荐
相关产品推荐

