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()