You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:47:51