如何让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
相关产品推荐
相关产品推荐

