2025年10月16日 星期四

SQLite 資料庫 -2

 SQLite 資料庫 -2




功能說明

功能動作
建立資料庫建立或更新 MySchoolDB.db 中的 student 資料表
新增資料新增學號、姓名、系碼
更正資料以學號為主鍵更新姓名與系碼
刪除資料依學號刪除
顯示所有資料顯示目前所有學生資料
刪除資料庫刪除整個 MySchoolDB.db(包含 department 與 student)


import tkinter as tk

from tkinter import ttk, messagebox

import sqlite3

import os


DB_NAME = "MySchoolDB.db"   # ✅ 使用相同的資料庫


# === 建立資料庫與 student 資料表 ===

def create_db():

    conn = sqlite3.connect(DB_NAME)

    cursor = conn.cursor()

    cursor.execute('''

        CREATE TABLE IF NOT EXISTS student (

            學號 CHAR(10) PRIMARY KEY,

            姓名 VARCHAR(50) NOT NULL,

            系碼 CHAR(10) NOT NULL

        )

    ''')

    conn.commit()

    conn.close()

    messagebox.showinfo("訊息", f"{DB_NAME} 中的 student 資料表已建立完成!")


# === 新增資料 ===

def add_data():

    if not os.path.exists(DB_NAME):

        messagebox.showwarning("警告", "請先建立資料庫!")

        return


    sid = entry_id.get().strip()

    sname = entry_name.get().strip()

    dept = entry_dept.get().strip()


    if sid == "" or sname == "" or dept == "":

        messagebox.showwarning("警告", "所有欄位都必須輸入!")

        return


    conn = sqlite3.connect(DB_NAME)

    cursor = conn.cursor()

    try:

        cursor.execute("INSERT INTO student VALUES (?, ?, ?)", (sid, sname, dept))

        conn.commit()

        messagebox.showinfo("成功", "學生資料已新增!")

        show_all()

    except sqlite3.IntegrityError:

        messagebox.showerror("錯誤", "該學號已存在!")

    conn.close()


# === 更正資料 ===

def update_data():

    sid = entry_id.get().strip()

    sname = entry_name.get().strip()

    dept = entry_dept.get().strip()


    if sid == "":

        messagebox.showwarning("警告", "請輸入要更正的學號!")

        return


    conn = sqlite3.connect(DB_NAME)

    cursor = conn.cursor()

    cursor.execute("UPDATE student SET 姓名=?, 系碼=? WHERE 學號=?", (sname, dept, sid))

    conn.commit()

    conn.close()

    messagebox.showinfo("成功", "資料已更新!")

    show_all()


# === 刪除資料 ===

def delete_data():

    sid = entry_id.get().strip()

    if sid == "":

        messagebox.showwarning("警告", "請輸入要刪除的學號!")

        return


    conn = sqlite3.connect(DB_NAME)

    cursor = conn.cursor()

    cursor.execute("DELETE FROM student WHERE 學號=?", (sid,))

    conn.commit()

    conn.close()

    messagebox.showinfo("成功", "資料已刪除!")

    show_all()


# === 顯示所有資料 ===

def show_all():

    if not os.path.exists(DB_NAME):

        messagebox.showwarning("警告", "請先建立資料庫!")

        return


    for row in tree.get_children():

        tree.delete(row)


    conn = sqlite3.connect(DB_NAME)

    cursor = conn.cursor()

    cursor.execute("SELECT * FROM student")

    rows = cursor.fetchall()

    for row in rows:

        tree.insert("", "end", values=row)

    conn.close()


# === 刪除資料庫 ===

def delete_db():

    if os.path.exists(DB_NAME):

        os.remove(DB_NAME)

        for row in tree.get_children():

            tree.delete(row)

        messagebox.showinfo("成功", f"{DB_NAME} 已刪除!")

    else:

        messagebox.showwarning("警告", "資料庫不存在!")


# === Tkinter 介面 ===

root = tk.Tk()

root.title("學生資料表管理系統 (MySchoolDB.db)")

root.geometry("700x500")


frame_top = tk.Frame(root)

frame_top.pack(pady=10)


tk.Label(frame_top, text="學號:").grid(row=0, column=0, padx=5, pady=5)

entry_id = tk.Entry(frame_top)

entry_id.grid(row=0, column=1, padx=5)


tk.Label(frame_top, text="姓名:").grid(row=1, column=0, padx=5, pady=5)

entry_name = tk.Entry(frame_top)

entry_name.grid(row=1, column=1, padx=5)


tk.Label(frame_top, text="系碼:").grid(row=2, column=0, padx=5, pady=5)

entry_dept = tk.Entry(frame_top)

entry_dept.grid(row=2, column=1, padx=5)


frame_btn = tk.Frame(root)

frame_btn.pack(pady=10)


ttk.Button(frame_btn, text="建立資料庫", command=create_db).grid(row=0, column=0, padx=5)

ttk.Button(frame_btn, text="新增資料", command=add_data).grid(row=0, column=1, padx=5)

ttk.Button(frame_btn, text="更正資料", command=update_data).grid(row=0, column=2, padx=5)

ttk.Button(frame_btn, text="刪除資料", command=delete_data).grid(row=0, column=3, padx=5)

ttk.Button(frame_btn, text="顯示所有資料", command=show_all).grid(row=0, column=4, padx=5)

ttk.Button(frame_btn, text="刪除資料庫", command=delete_db).grid(row=0, column=5, padx=5)


# === Treeview 顯示區 ===

tree = ttk.Treeview(root, columns=("學號", "姓名", "系碼"), show="headings", height=10)

tree.heading("學號", text="學號")

tree.heading("姓名", text="姓名")

tree.heading("系碼", text="系碼")

tree.pack(pady=10, fill="x")


root.mainloop()








沒有留言:

張貼留言

ESP32 (ESP-IDF in VS Code) MFRC522 + MQTT + PYTHON TKinter +SQLite

 ESP32 (ESP-IDF in VS Code) MFRC522 + MQTT + PYTHON TKinter +SQLite  ESP32 VS Code 程式 ; PlatformIO Project Configuration File ; ;   Build op...