Загрузка данных


import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
from datetime import datetime

db = sqlite3.connect("glucose.db")
db.execute("PRAGMA foreign_keys = ON")

db.executescript("""
CREATE TABLE IF NOT EXISTS user (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    birthday TEXT,
    gender TEXT
);

CREATE TABLE IF NOT EXISTS health (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    weight REAL,
    height REAL,
    minGlucose REAL,
    maxGlucose REAL,
    FOREIGN KEY(user_id) REFERENCES user(id)
);

CREATE TABLE IF NOT EXISTS glucose (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    glucoseLvl REAL NOT NULL,
    dateLvl TEXT NOT NULL,
    contextGlucose TEXT,
    note TEXT,
    FOREIGN KEY(user_id) REFERENCES user(id)
);
""")
db.commit()

root = tk.Tk()
root.title("Измерение глюкозы")
root.geometry("700x500")

tk.Label(root, text="Учёт глюкозы",
         font=("Arial", 18)).pack(pady=10)

form = tk.Frame(root)
form.pack(pady=5)

tk.Label(form, text="Имя пользователя").grid(row=0, column=0)
name_entry = tk.Entry(form)
name_entry.grid(row=0, column=1)

tk.Label(form, text="Дата рождения").grid(row=1, column=0)
birthday_entry = tk.Entry(form)
birthday_entry.grid(row=1, column=1)

tk.Label(form, text="Пол").grid(row=2, column=0)
gender_entry = ttk.Combobox(
    form, values=["Мужской", "Женский", "Другой"]
)
gender_entry.grid(row=2, column=1)

tk.Label(form, text="Глюкоза (ммоль/л)").grid(row=3, column=0)
glucose_entry = tk.Entry(form)
glucose_entry.grid(row=3, column=1)

tk.Label(form, text="Контекст").grid(row=4, column=0)
context_entry = ttk.Combobox(
    form,
    values=["Натощак", "После еды", "До еды", "Другое"]
)
context_entry.grid(row=4, column=1)

tk.Label(form, text="Самочувствие").grid(row=5, column=0)
note_entry = tk.Entry(form)
note_entry.grid(row=5, column=1)

def add_measurement():
    name = name_entry.get().strip()
    birthday = birthday_entry.get().strip()
    gender = gender_entry.get()
    value = glucose_entry.get().strip().replace(",", ".")

    if not name or not value:
        messagebox.showerror("Ошибка", "Введите имя и глюкозу")
        return

    try:
        value = float(value)
        if value <= 0:
            raise ValueError
    except ValueError:
        messagebox.showerror("Ошибка", "Неверное значение глюкозы")
        return

    cur = db.cursor()
    cur.execute(
        "SELECT id FROM user WHERE name=? AND birthday=?",
        (name, birthday)
    )
    result = cur.fetchone()

    if result:
        user_id = result[0]
    else:
        cur.execute(
            "INSERT INTO user (name, birthday, gender) VALUES (?, ?, ?)",
            (name, birthday, gender)
        )
        user_id = cur.lastrowid

    cur.execute("""
        INSERT INTO glucose
        (user_id, glucoseLvl, dateLvl, contextGlucose, note)
        VALUES (?, ?, ?, ?, ?)
    """, (
        user_id,
        value,
        datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        context_entry.get(),
        note_entry.get()
    ))

    db.commit()
    refresh_table()
    glucose_entry.delete(0, tk.END)
    note_entry.delete(0, tk.END)
    messagebox.showinfo("Готово", "Измерение сохранено")

def refresh_table():
    for item in table.get_children():
        table.delete(item)

    rows = db.execute("""
        SELECT glucose.id, user.name, glucose.glucoseLvl,
               glucose.dateLvl, glucose.contextGlucose, glucose.note
        FROM glucose
        JOIN user ON user.id = glucose.user_id
        ORDER BY glucose.id DESC
    """).fetchall()

    for row in rows:
        table.insert("", "end", values=row)

tk.Button(
    root, text="Сохранить измерение",
    command=add_measurement
).pack(pady=10)

table = ttk.Treeview(
    root,
    columns=("id", "name", "value", "date", "context", "note"),
    show="headings"
)

for col, title in [
    ("id", "ID"),
    ("name", "Пользователь"),
    ("value", "Глюкоза"),
    ("date", "Дата"),
    ("context", "Контекст"),
    ("note", "Самочувствие")
]:
    table.heading(col, text=title)
    table.column(col, width=105)

table.pack(fill="both", expand=True, padx=10, pady=10)

refresh_table()
root.mainloop()
db.close()