main.py
Instructions

Replace in main.py:

Replace in database.py:




main.py
import tkinter as tk
from tkinter import ttk
import sqlite3

import database as db

try:
    from ctypes import windll
    windll.shcore.SetProcessDpiAwareness(1)
except:
    pass

class Window(tk.Frame):
    def __init__(self, container):
        super().__init__(container)
        self.columnconfigure((0, 1), weight=1)
        self.rowconfigure(0, weight=1)
        self.grid(row=0, column=0, sticky="NEWS")

        ttk.Label(self, text=f"Database connected successfully").grid(row=0, column=0, sticky="NEWS", pady=150, padx=150, columnspan=2)
        ttk.Button(self, text="Database manager", command=lambda: db.DatabaseManager(root, cm=lambda: start_app())).grid(row=1, column=0, sticky="E", pady=50, padx=5)
        ttk.Button(self, text="Export database", command=lambda: db.database_backup()).grid(row=1, column=1, sticky="W", pady=50, padx=5)

def start_app():
    try:
        db.check_database()
        Window(root)
    except sqlite3.OperationalError:
        db.DatabaseManager(root, cm=lambda: start_app())

root = tk.Tk()

start_app()

root.mainloop()



database.py
import tkinter as tk
from tkinter import filedialog, messagebox
import os
import pickle
import sqlite3
import shutil
import datetime

database_id = 'unique_id'

try:
    with open("./databases/database_data.dat", "rb") as file:
        database_name = pickle.load(file)
except:
    database_name = ''


def check_database_id(selected_database):
    connection = sqlite3.connect(selected_database)
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM database_id")
    check_id = cursor.fetchone()
    cursor.close()
    connection.close()
    if check_id[0] == database_id:
        return True


def database_backup():
    database_path = filedialog.askopenfilename(title="Select database to export", defaultextension="db", initialdir=f'{os.path.abspath(database_name)}')
    if database_path:
        path = filedialog.askdirectory(title='Select folder')
        try:
            shutil.copyfile(database_path, f"{path}/{datetime.datetime.now().strftime('%Y%m%d')}_database_backup.db")
        except FileNotFoundError:
            pass


class DatabaseManager(tk.Frame):
    def __init__(self, container, cm=None, *args, **kwargs):
        super().__init__(container, *args, **kwargs)
        self.cm = cm

        self.columnconfigure(0, minsize=500, weight=1)
        self.rowconfigure((0, 1), weight=1)
        self.config(bg='white')
        self.grid(row=0, column=0, sticky='NEWS')

        self.sqlite_logo = tk.PhotoImage(file="./assets_database/logo_sqlite.png")
        self.label_logo_sqlite = tk.Label(self, image=self.sqlite_logo, bg='white', height=304)
        self.label_logo_sqlite.grid(row=0, column=0, sticky='s', padx=50, pady=50)

        self.buttons_frame = tk.Frame(self, bg='white')
        self.buttons_frame.grid(row=1, column=0, sticky='n')
        self.buttons_frame.columnconfigure((0, 1), weight=1)

        self.create_image = tk.PhotoImage(file="./assets_database/database_open.png")
        self.button_sqlite_create = tk.Button(self.buttons_frame, image=self.create_image, compound="top", text="OPEN", width=150, bg='white', relief='flat')
        self.button_sqlite_create["command"] = lambda: self.database_open()
        self.button_sqlite_create.grid(row=0, column=0, sticky="ew")

        self.open_image = tk.PhotoImage(file="./assets_database/database_add.png")
        self.button_sqlite_open = tk.Button(self.buttons_frame, image=self.open_image, compound="top", text="CREATE", width=150, bg='white', relief='flat',)
        self.button_sqlite_open["command"] = lambda: self.database_create()
        self.button_sqlite_open.grid(row=0, column=1, sticky="ew")

        self.status_label_database_name = tk.Label(self.buttons_frame, text='', bg='white', fg="black")
        self.status_label_database_name.grid(row=2, column=0, sticky="WE", columnspan=2)

        if self.cm is not None:
            self.start_app_image = tk.PhotoImage(file="./assets_database/apply.png")
            self.button_start_app = tk.Button(self.buttons_frame, text='Launch app', compound="left", bg='white', relief='flat', image=self.start_app_image, state='disabled')
            self.button_start_app["command"] = self.cm
            self.button_start_app.grid(row=3, column=0, pady=20, sticky="ew", columnspan=2)

        if database_name != '':
            self.status_label_database_name.config(text=f"Selected database: {os.path.basename(database_name)}", fg='#0f80cc')
            self.button_start_app['state'] = 'normal'

    def database_create(self):
        global database_name
        try:
            database_path = filedialog.asksaveasfilename(title="Create Database", initialdir="./databases/", defaultextension="db", filetypes=(("Database files *.db", "*.db"), ("All files", "*.*")))
        except (AttributeError, FileNotFoundError):
            return

        if len(database_path) != 0:
            database_name = database_path
            try:
                with sqlite3.connect(database_path) as connection:
                    cursor = connection.cursor()
                    cursor.execute("CREATE TABLE IF NOT EXISTS database_id(d_id text)")
                    cursor.execute("INSERT INTO database_id VALUES(?)", (database_id,))
                    with open("./databases/database_data.dat", "wb") as dumpfile:
                        pickle.dump(database_name, dumpfile)
                    self.status_label_database_name.config(text=f"Selected database: {os.path.basename(database_name)}", fg='#0f80cc')
                    self.button_start_app['state'] = 'normal'
                    ##############################################################################################################
                    create_tables = "CREATE TABLE IF NOT EXISTS sample (name TEXT NOT NULL, date TEXT NOT NULL, description TEXT)"
                    ##############################################################################################################
                    cursor.execute(create_tables)
                    cursor.close()
                    connection.commit()
            except sqlite3.Error as error:
                messagebox.showerror(title='Database Error', message=f"{os.path.basename(database_name).capitalize()} ERROR:\n{error}")

    def database_open(self):
        global database_name
        try:
            database_to_import = filedialog.askopenfilename(title="Select database file to open", filetypes=(("Database files", "*.db"), ("All files", "*.*")))
        except (AttributeError, FileNotFoundError):
            messagebox.showinfo(title='Error', message="Error opening database, please try again.")
            return
        if len(database_to_import) != 0:
            if database_to_import != '':
                if check_database_id(database_to_import):
                    database_name = database_to_import
                    with open("./databases/database_data.dat", "wb") as dumpfile:
                        pickle.dump(database_name, dumpfile)
                    self.status_label_database_name.config(text=f"Selected database: {os.path.basename(database_name)}", fg='#0f80cc')
                    self.button_start_app['state'] = 'normal'
                else:
                    messagebox.showinfo(title='Database Error', message=f"{os.path.basename(database_to_import).capitalize()} doesn't belong to this app.")

def check_database():
    with sqlite3.connect(database_name) as connection:
        cursor = connection.cursor()
        cursor.execute("SELECT * FROM database_id")
        dbcheck = cursor.fetchone()
        cursor.close()
        return dbcheck