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

如何让Tkinter复选框保持勾选状态并保存到本地SQLite数据库?

Tkinter复选框状态持久化到SQLite数据库实现方案

核心问题修正点

  • 数据库连接过早关闭,导致后续无法读写数据
  • 部分复选框未绑定状态变量,无法捕获勾选变化
  • 数据库操作语法错误,保存逻辑未关联实际复选框状态
  • 缺失启动时从数据库恢复勾选状态的逻辑

完整实现代码

import sqlite3
import tkinter as tk
from tkinter import ttk

# 初始化主窗口
box = tk.Tk()
box.geometry('600x450')
box.title('November Assesment Study List')
box.resizable(False, False)

# 定义复选框状态变量
algebra_var = tk.IntVar()
calculus_var = tk.IntVar()
trig_var = tk.IntVar()

# 数据库操作函数
def init_db():
    """初始化数据库,创建科目表(如果不存在)"""
    conn = sqlite3.connect("Checkedboxes.db")
    cursor = conn.cursor()
    # 创建表:科目名唯一,is_checked存储勾选状态(1=勾选,0=未勾选)
    cursor.execute('''CREATE TABLE IF NOT EXISTS subjects
                      (subject TEXT PRIMARY KEY, is_checked INTEGER)''')
    # 初始化默认科目数据(如果不存在)
    default_subjects = [('Algebra', 0), ('Calculus', 0), ('Trig', 0)]
    cursor.executemany('INSERT OR IGNORE INTO subjects VALUES (?, ?)', default_subjects)
    conn.commit()
    conn.close()

def load_checkbox_states():
    """从数据库加载已保存的复选框状态"""
    conn = sqlite3.connect("Checkedboxes.db")
    cursor = conn.cursor()
    cursor.execute('SELECT subject, is_checked FROM subjects')
    rows = cursor.fetchall()
    for subject, state in rows:
        if subject == 'Algebra':
            algebra_var.set(state)
        elif subject == 'Calculus':
            calculus_var.set(state)
        elif subject == 'Trig':
            trig_var.set(state)
    conn.close()

def save_checkbox_state(subject, var):
    """保存单个复选框状态到数据库"""
    conn = sqlite3.connect("Checkedboxes.db")
    cursor = conn.cursor()
    cursor.execute('UPDATE subjects SET is_checked = ? WHERE subject = ?', (var.get(), subject))
    conn.commit()
    conn.close()

# 初始化数据库并加载状态
init_db()
load_checkbox_states()

# 弹窗创建函数
def open_maths_window():
    new_window = tk.Toplevel(box)
    new_window.title("Maths")
    new_window.geometry("400x200")
    
    # 创建复选框,绑定状态变量和保存逻辑
    ttk.Checkbutton(
        new_window, 
        text='Algebra', 
        variable=algebra_var, 
        onvalue=1, 
        offvalue=0,
        command=lambda: save_checkbox_state('Algebra', algebra_var)
    ).pack(pady=5)
    
    ttk.Checkbutton(
        new_window, 
        text='Calculus', 
        variable=calculus_var, 
        onvalue=1, 
        offvalue=0,
        command=lambda: save_checkbox_state('Calculus', calculus_var)
    ).pack(pady=5)
    
    ttk.Checkbutton(
        new_window, 
        text='Trig', 
        variable=trig_var, 
        onvalue=1, 
        offvalue=0,
        command=lambda: save_checkbox_state('Trig', trig_var)
    ).pack(pady=5)

# 主窗口按钮
btn = ttk.Button(box, text="Maths", command=open_maths_window)
btn.pack(pady=10)

# 启动主循环
box.mainloop()

关键逻辑说明

  • init_db():程序启动时自动创建数据库和表,同时插入默认科目数据(避免首次运行报错)
  • load_checkbox_states():从数据库读取历史勾选状态,设置到对应变量,实现启动后保持之前的勾选
  • save_checkbox_state():每个复选框勾选状态变化时,自动更新数据库中的对应记录
  • 用IntVar存储复选框状态,比StringVar更适配数据库的整数类型
  • 每个复选框绑定command参数,触发状态保存操作

内容的提问来源于stack exchange,提问作者KARIMJ111

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:55:23