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

如何将CustomTkinter用户输入保存为数据库文件?

实现CustomTkinter计分板输入数据导出到数据库的方法

针对你的需求,推荐用Python自带的SQLite数据库(轻量、无需额外安装服务,数据存为本地文件),结合CustomTkinter的输入组件完成数据导出,具体步骤和语法如下:

1. 先收集GUI中的用户输入

CustomTkinter的输入组件(比如CTkEntry)和原生Tkinter用法一致,通过.get()方法获取输入内容,记得做基础的数据验证:

# 假设你有姓名和得分的输入框
player_name = name_entry.get().strip()  # 去空格
player_score = int(score_entry.get().strip())  # 得分转整数(注意捕获转换失败的异常)

2. 连接并操作SQLite数据库

SQLite是Python标准库自带的模块,直接导入sqlite3即可使用:

2.1 创建数据库和表

首次运行时需要创建存储数据的表,用CREATE TABLE IF NOT EXISTS避免重复创建报错:

import sqlite3

# 连接数据库(不存在则自动生成scoreboard.db文件)
conn = sqlite3.connect('scoreboard.db')
cursor = conn.cursor()

# 创建计分表:包含自增ID、选手姓名、得分、记录时间
cursor.execute('''
CREATE TABLE IF NOT EXISTS scores (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    player_name TEXT NOT NULL,
    player_score INTEGER NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()  # 提交操作
conn.close()   # 关闭连接

2.2 将输入数据插入数据库

把收集到的用户输入插入表中,用占位符?避免SQL注入,保证安全性:

def save_data_to_db(name, score):
    with sqlite3.connect('scoreboard.db') as conn:  # with语句自动管理连接关闭
        cursor = conn.cursor()
        cursor.execute(
            'INSERT INTO scores (player_name, player_score) VALUES (?, ?)',
            (name, score)  # 对应占位符的参数
        )
        conn.commit()

3. 整合到CustomTkinter的按钮事件

给GUI添加一个“保存到数据库”按钮,点击时触发数据收集和插入操作:

import customtkinter as ctk
import sqlite3
from customtkinter import CTkMessageBox

ctk.set_appearance_mode("Light")
ctk.set_default_color_theme("blue")

root = ctk.CTk()
root.title("计分板")

# 输入组件
name_label = ctk.CTkLabel(root, text="选手姓名")
name_label.pack(pady=5)
name_entry = ctk.CTkEntry(root, width=200)
name_entry.pack(pady=5)

score_label = ctk.CTkLabel(root, text="得分")
score_label.pack(pady=5)
score_entry = ctk.CTkEntry(root, width=200)
score_entry.pack(pady=5)

def save_to_db():
    # 数据验证
    player_name = name_entry.get().strip()
    if not player_name:
        CTkMessageBox.show_error(title="错误", message="请输入选手姓名")
        return
    try:
        player_score = int(score_entry.get().strip())
    except ValueError:
        CTkMessageBox.show_error(title="错误", message="得分必须是整数")
        return
    
    # 插入数据库
    try:
        with sqlite3.connect('scoreboard.db') as conn:
            cursor = conn.cursor()
            cursor.execute('''
            CREATE TABLE IF NOT EXISTS scores (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                player_name TEXT NOT NULL,
                player_score INTEGER NOT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
            ''')
            cursor.execute('INSERT INTO scores (player_name, player_score) VALUES (?, ?)',
                           (player_name, player_score))
            conn.commit()
        CTkMessageBox.show_info(title="成功", message="数据已保存到数据库")
        # 清空输入框
        name_entry.delete(0, ctk.END)
        score_entry.delete(0, ctk.END)
    except Exception as e:
        CTkMessageBox.show_error(title="错误", message=f"保存失败:{str(e)}")

# 保存按钮
save_btn = ctk.CTkButton(root, text="保存到数据库", command=save_to_db)
save_btn.pack(pady=20)

root.mainloop()

关键说明

  • SQLite生成的scoreboard.db文件会存放在你的脚本同级目录,直接用SQLite可视化工具就能查看数据。
  • 数据验证是必要的,避免空值、非法格式数据存入数据库。
  • 用with语句管理数据库连接,无需手动关闭,避免资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:33:30