Python GUI DB App

import tkinter as tk
from tkinter import ttk, messagebox
import mysql.connector

# MySQL connection
def connect_db():
    try:
        return mysql.connector.connect(
            host="localhost",
            user="your_username",
            password="your_password",
            database="testdb"
        )
    except mysql.connector.Error as err:
        messagebox.showerror("Database Error", f"Error: {err}")
        return None

# Main App Class
class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Multi-Page Tkinter + MySQL App")
        self.geometry("600x450")
        self.resizable(False, False)

        # Create container and all frames
        container = tk.Frame(self)
        container.pack(fill="both", expand=True)

        self.frames = {}
        for F in (LoginPage, DashboardPage, UserFormPage):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(LoginPage)

    def show_frame(self, page):
        frame = self.frames[page]
        frame.tkraise()

# Login Page
class LoginPage(tk.Frame):
    def __init__(self, parent, controller):
        super().__init__(parent)
        self.controller = controller

        tk.Label(self, text="Login Page", font=("Arial", 18)).pack(pady=20)
        tk.Label(self, text="Username").pack()
        self.username_entry = tk.Entry(self)
        self.username_entry.pack()
        tk.Label(self, text="Password").pack()
        self.password_entry = tk.Entry(self, show="*")
        self.password_entry.pack()

        tk.Button(self, text="Login", command=self.login).pack(pady=10)

    def login(self):
        # Just a mock login (replace with real user table if needed)
        if self.username_entry.get() == "admin" and self.password_entry.get() == "admin":
            self.controller.show_frame(DashboardPage)
        else:
            messagebox.showerror("Login Failed", "Invalid credentials.")

# Dashboard Page
class DashboardPage(tk.Frame):
    def __init__(self, parent, controller):
        super().__init__(parent)
        self.controller = controller
        tk.Label(self, text="Dashboard", font=("Arial", 18)).pack(pady=20)

        tk.Button(self, text="Manage Users", command=lambda: controller.show_frame(UserFormPage)).pack(pady=10)
        tk.Button(self, text="Logout", command=lambda: controller.show_frame(LoginPage)).pack()

# User Form Page
class UserFormPage(tk.Frame):
    def __init__(self, parent, controller):
        super().__init__(parent)
        self.controller = controller

        self.selected_id = None

        tk.Label(self, text="User Form", font=("Arial", 16)).pack(pady=10)

        # Entry fields
        self.name_entry = tk.Entry(self, width=30)
        self.email_entry = tk.Entry(self, width=30)

        tk.Label(self, text="Name").pack()
        self.name_entry.pack()
        tk.Label(self, text="Email").pack()
        self.email_entry.pack()

        btn_frame = tk.Frame(self)
        btn_frame.pack(pady=10)
        tk.Button(btn_frame, text="Add", command=self.insert_data).grid(row=0, column=0, padx=5)
        tk.Button(btn_frame, text="Update", command=self.update_data).grid(row=0, column=1, padx=5)
        tk.Button(btn_frame, text="Delete", command=self.delete_data).grid(row=0, column=2, padx=5)
        tk.Button(btn_frame, text="Back", command=lambda: controller.show_frame(DashboardPage)).grid(row=0, column=3, padx=5)

        # Search box
        self.search_entry = tk.Entry(self)
        self.search_entry.pack()
        tk.Button(self, text="Search", command=self.search_data).pack(pady=5)

        # Treeview table
        self.tree = ttk.Treeview(self, columns=("ID", "Name", "Email"), show='headings')
        self.tree.heading("ID", text="ID")
        self.tree.heading("Name", text="Name")
        self.tree.heading("Email", text="Email")
        self.tree.bind("<>", self.select_item)
        self.tree.pack(fill="both", expand=True, pady=10)

        self.fetch_data()

    def insert_data(self):
        name = self.name_entry.get()
        email = self.email_entry.get()

        if name and email:
            conn = connect_db()
            if conn:
                cursor = conn.cursor()
                cursor.execute("INSERT INTO users (name, email) VALUES (%s, %s)", (name, email))
                conn.commit()
                conn.close()
                messagebox.showinfo("Success", "User added.")
                self.clear()
                self.fetch_data()

    def fetch_data(self):
        for row in self.tree.get_children():
            self.tree.delete(row)

        conn = connect_db()
        if conn:
            cursor = conn.cursor()
            cursor.execute("SELECT id, name, email FROM users")
            for row in cursor.fetchall():
                self.tree.insert("", tk.END, values=row)
            conn.close()

    def select_item(self, event):
        selected = self.tree.focus()
        if selected:
            values = self.tree.item(selected, 'values')
            self.selected_id = values[0]
            self.name_entry.delete(0, tk.END)
            self.email_entry.delete(0, tk.END)
            self.name_entry.insert(0, values[1])
            self.email_entry.insert(0, values[2])

    def update_data(self):
        if not self.selected_id:
            messagebox.showwarning("Select a record", "Please select a user to update.")
            return
        conn = connect_db()
        if conn:
            cursor = conn.cursor()
            cursor.execute("UPDATE users SET name=%s, email=%s WHERE id=%s",
                           (self.name_entry.get(), self.email_entry.get(), self.selected_id))
            conn.commit()
            conn.close()
            messagebox.showinfo("Updated", "User updated.")
            self.clear()
            self.fetch_data()

    def delete_data(self):
        if not self.selected_id:
            messagebox.showwarning("Select a record", "Please select a user to delete.")
            return
        confirm = messagebox.askyesno("Confirm", "Are you sure?")
        if confirm:
            conn = connect_db()
            if conn:
                cursor = conn.cursor()
                cursor.execute("DELETE FROM users WHERE id=%s", (self.selected_id,))
                conn.commit()
                conn.close()
                messagebox.showinfo("Deleted", "User deleted.")
                self.clear()
                self.fetch_data()

    def search_data(self):
        keyword = self.search_entry.get()
        for row in self.tree.get_children():
            self.tree.delete(row)

        conn = connect_db()
        if conn:
            cursor = conn.cursor()
            cursor.execute("SELECT id, name, email FROM users WHERE name LIKE %s OR email LIKE %s",
                           ('%' + keyword + '%', '%' + keyword + '%'))
            for row in cursor.fetchall():
                self.tree.insert("", tk.END, values=row)
            conn.close()

    def clear(self):
        self.name_entry.delete(0, tk.END)
        self.email_entry.delete(0, tk.END)
        self.search_entry.delete(0, tk.END)
        self.selected_id = None

# Run the app
if __name__ == "__main__":
    app = App()
    app.mainloop()

Post a Comment