
4.2. Fill Example Data - заполнение базы данных тестовыми данными
Для заполнения базы данных тестовыми данными требуется нажать кнопку “Fill Example Data”. Если база данных пуста, увидим окно об успешном заполнении базы тестовым примером
Сама база данных теперь
Кроме того, для предотвращения заполнения базы данных с пользовательскими данными тестовыми данными для этого предусмотрено ограничение, которое не позволяет в непустую базу данных вставить тестовые данные. Вот как это будет выглядеть при непустой базе данных, если мы нажмем кнопку “Fill Example Data”
Листинг кода
Так как большинство функций было разработано в лабораторной работе, на основе которой написана эта курсовая работа, то приведем код только интерфейсной части, опустив содержание функций.
import tkinter as tk
from tkinter import *
from tkinter import ttk
import sqlite3
from tkinter import messagebox
path = "C:/Users/admin/source/repos/UNIVERSITY_repos/3 course/6 sem/mispris/coursework/furniture.db"
class DatabaseApp:
def __init__(self, root):
self.root = root
self.root.title("coursework")
root.geometry("1000x600")
self.conn = sqlite3.connect(path)
self.cursor = self.conn.cursor()
self.tree = ttk.Treeview(root, show="headings")
self.tree.grid(row=0, column=0, columnspan=4, sticky="nsew", padx=10, pady=10)
self.load_button = ttk.Button(root, text="Load Products", command=self.load_products)
self.load_button.grid(row=1, column=0, sticky="ew", padx=10, pady=5)
self.add_product_button = ttk.Button(root, text="Add product", command=self.add_product)
self.add_product_button.grid(row=2, column=0, sticky="ew", padx=10, pady=5)
self.edit_button = ttk.Button(root, text="Edit Selected", command=self.edit_product)
self.edit_button.grid(row=3, column=0, sticky="ew", padx=10, pady=5)
self.delete_button = ttk.Button(root, text="Delete Selected", command=self.delete_product)
self.delete_button.grid(row=4, column=0, sticky="ew", padx=10, pady=5)
self.load_category_button = ttk.Button(root, text="Load Categories", command=self.load_categories)
self.load_category_button.grid(row=1, column=1, sticky="ew", padx=10, pady=5)
self.add_category_button = ttk.Button(root, text="Add Category", command=self.add_category)
self.add_category_button.grid(row=2, column=1, sticky="ew", padx=10, pady=5)
self.edit_category_button = ttk.Button(root, text="Edit Category", command=self.edit_category)
self.edit_category_button.grid(row=3, column=1, sticky="ew", padx=10, pady=5)
self.delete_category_button = ttk.Button(root, text="Delete Category", command=self.delete_category)
self.delete_category_button.grid(row=4, column=1, sticky="ew", padx=10, pady=5)
self.show_parents_button = ttk.Button(root, text="Show Parents", command=self.show_category_parents)
self.show_parents_button.grid(row=5, column=1, sticky="ew", padx=10, pady=5)
self.show_children_button = ttk.Button(root, text="Show Children", command=self.show_category_children)
self.show_children_button.grid(row=6, column=1, sticky="ew", padx=10, pady=5)
self.show_products_button = ttk.Button(root, text="Show products", command=self.show_products_for_category)
self.show_products_button.grid(row=7, column=1, sticky="ew", padx=10, pady=5)
self.load_unit_button = ttk.Button(root, text="Load Unit", command=self.load_unit)
self.load_unit_button.grid(row=1, column=2, sticky="ew", padx=10, pady=5)
self.add_unit_button = ttk.Button(root, text="Add Unit", command=self.add_unit)
self.add_unit_button.grid(row=2, column=2, sticky="ew", padx=10, pady=5)
self.edit_unit_button = ttk.Button(root, text="Edit Selected", command=self.edit_unit)
self.edit_unit_button.grid(row=3, column=2, sticky="ew", padx=10, pady=5)
self.delete_unit_button = ttk.Button(root, text="Delete Selected", command=self.delete_unit)
self.delete_unit_button.grid(row=4, column=2, sticky="ew", padx=10, pady=5)
self.fill_example_data_button = ttk.Button(self.root, text="Fill Example Data", command=self.fill_example_data)
self.fill_example_data_button.grid(row=1, column=3, sticky="ew", padx=10, pady=5)
self.delete_all_data_button = ttk.Button(self.root, text="Delete All Data", command=self.delete_all_data)
self.delete_all_data_button.grid(row=2, column=3, sticky="ew", padx=10, pady=5)
# Configure row and column to resize
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)
root.columnconfigure(2, weight=1)
root.columnconfigure(3, weight=1)
def create_category_table():
self.cursor.execute('''CREATE TABLE IF NOT EXISTS category
(id INTEGER PRIMARY KEY AUTOINCREMENT,
id_parent INTEGER,
category_name TEXT UNIQUE,
FOREIGN KEY (id_parent) REFERENCES category(id))''')
self.conn.commit()
def create_product_table():
self.cursor.execute('''CREATE TABLE IF NOT EXISTS product
(id INTEGER PRIMARY KEY AUTOINCREMENT,
id_category INTEGER,
id_unit INTEGER,
product_name TEXT NOT NULL,
quantity INTEGER DEFAULT 0,
price REAL DEFAULT 0,
FOREIGN KEY (id_unit) REFERENCES unit(id),
FOREIGN KEY (id_category) REFERENCES category(id))''')
self.conn.commit()
def create_unit_table():
self.cursor.execute('''CREATE TABLE IF NOT EXISTS unit
(id INTEGER PRIMARY KEY AUTOINCREMENT,
unit_name TEXT NOT NULL UNIQUE,
unit_name_short TEXT NOT NULL)''')
self.conn.commit()
def creating_tables():
create_category_table()
create_product_table()
create_unit_table()
creating_tables()
def load_unit(self):
def load_products(self):
def load_categories(self):
def add_category(self):
def edit_category(self):
def check_cyclic_dependency(self, new_parent_id, category_id):
def fetch_parent_category(cat_id):
def add_unit(self):
def edit_unit(self):
def delete_unit(self):
def add_product(self):
def edit_product(self):
def delete_product(self):
def fill_example_data(self):
def load_products(self):
def delete_category(self):
def is_category_exists(self, category_name):
def show_category_parents(self):
def show_category_children(self):
def get_all_children(self, category_id):
def show_products_for_category(self):
def delete_all_data(self):
def confirm_delete():
def add_example_data(self):
def __del__(self):
self.conn.close()
class DatabaseUserApp:
def __init__(self, root):
self.root = root
self.root.title("coursework")
root.geometry("1000x600")
self.conn = sqlite3.connect(path)
self.cursor = self.conn.cursor()
self.tree = ttk.Treeview(root, show="headings")
self.tree.grid(row=0, column=0, columnspan=4, sticky="nsew", padx=10, pady=10)
self.load_button = ttk.Button(root, text="Load Products", command=self.load_products)
self.load_button.grid(row=1, column=0, sticky="ew", padx=10, pady=5)
self.load_category_button = ttk.Button(root, text="Load Categories", command=self.load_categories)
self.load_category_button.grid(row=1, column=1, sticky="ew", padx=10, pady=5)
self.show_parents_button = ttk.Button(root, text="Show Parents", command=self.show_category_parents)
self.show_parents_button.grid(row=2, column=1, sticky="ew", padx=10, pady=5)
self.show_children_button = ttk.Button(root, text="Show Children", command=self.show_category_children)
self.show_children_button.grid(row=3, column=1, sticky="ew", padx=10, pady=5)
self.show_products_button = ttk.Button(root, text="Show products", command=self.show_products_for_category)
self.show_products_button.grid(row=4, column=1, sticky="ew", padx=10, pady=5)
self.load_unit_button = ttk.Button(root, text="Load Unit", command=self.load_unit)
self.load_unit_button.grid(row=1, column=2, sticky="ew", padx=10, pady=5)
# Configure row and column to resize
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)
root.columnconfigure(2, weight=1)
def create_category_table():
self.cursor.execute('''CREATE TABLE IF NOT EXISTS category
(id INTEGER PRIMARY KEY AUTOINCREMENT,
id_parent INTEGER,
category_name TEXT UNIQUE,
FOREIGN KEY (id_parent) REFERENCES category(id))''')
self.conn.commit()
def create_product_table():
self.cursor.execute('''CREATE TABLE IF NOT EXISTS product
(id INTEGER PRIMARY KEY AUTOINCREMENT,
id_category INTEGER,
id_unit INTEGER,
product_name TEXT NOT NULL,
quantity INTEGER DEFAULT 0,
price REAL DEFAULT 0,
FOREIGN KEY (id_unit) REFERENCES unit(id),
FOREIGN KEY (id_category) REFERENCES category(id))''')
self.conn.commit()
def create_unit_table():
self.cursor.execute('''CREATE TABLE IF NOT EXISTS unit
(id INTEGER PRIMARY KEY AUTOINCREMENT,
unit_name TEXT NOT NULL UNIQUE,
unit_name_short TEXT NOT NULL)''')
self.conn.commit()
def creating_tables():
create_category_table()
create_product_table()
create_unit_table()
creating_tables()
def load_unit(self):
def load_products(self):
def load_categories(self):
def load_products(self):
def show_category_parents(self):
def show_category_children(self):
def get_all_children(self, category_id):
def show_products_for_category(self):
def __del__(self):
self.conn.close()
class LoginWindow:
def __init__(self, master):
self.master = master
self.master.title("Login")
self.master.geometry("300x150")
self.label_login = tk.Label(self.master, text="Login:")
self.label_login.grid(row=0, column=0, padx=10, pady=10, sticky="e")
self.label_password = tk.Label(self.master, text="Password:")
self.label_password.grid(row=1, column=0, padx=10, pady=10, sticky="e")
self.entry_login = tk.Entry(self.master)
self.entry_login.grid(row=0, column=1, padx=10, pady=10)
self.entry_password = tk.Entry(self.master, show="*")
self.entry_password.grid(row=1, column=1, padx=10, pady=10)
self.btn_login = tk.Button(self.master, text="Login", command=self.login)
self.btn_login.grid(row=2, columnspan=2, padx=10, pady=10)
def login(self):
login = self.entry_login.get()
password = self.entry_password.get()
if login == "admin" and password == "admin":
self.master.destroy()
root = tk.Tk()
root.minsize(600, 350)
app = DatabaseApp(root)
root.mainloop()
elif login == "user" and password == "user":
self.master.destroy()
root = tk.Tk()
root.minsize(600, 350)
app = DatabaseUserApp(root)
root.mainloop()
else:
messagebox.showerror("Error", "Invalid login or password.")
if __name__ == "__main__":
root = tk.Tk()
login_window = LoginWindow(root)
root.mainloop()