Python Tkinter Project With MySQL Database

Python And MySQL - Project Example Using Tkinter With Source Code


Python Project With MySQL Database With Source Code


In this Python Project Tutorial we will see How To Create A Simple Program Example With MySQL  Database And Python Using Tkinter.

What We Will Use In This Tutorial:
- Python Programming Language .
- Tkinter For Graphicl User Interface.
- MySQL Database.
- VsCode IDE.
- XAMPP.
- PhpMyAdmin.

                                                     Project Tutorial


Project Source Code:


import tkinter as tk
from tkinter import *
from tkinter import ttk
from tkinter import filedialog
from PIL import ImageTk, Image
from tkinter import messagebox
import mysql.connector

# create a connection
connection = mysql.connector.connect(host='localhost', user='root', port='3306',
password='', database='new_py_db')
c = connection.cursor()

# create a function to get all products
def getAllProducts():
c.execute("SELECT * FROM `products`")
return c.fetchall()


products = getAllProducts()
p_index = 0


root = Tk()
root.title('Manage Products GUI')

frame_main = tk.Frame(root, bg='#bdc3c7')
frame = tk.Frame(frame_main, bg='#bdc3c7')
frame_btns = tk.Frame(frame, bg='#bdc3c7')
frame_btns_nav = tk.Frame(frame, bg='#bdc3c7')

categories = ['Car','Phone','Bags','Games','PC']
selected = StringVar(root)

id_label = tk.Label(frame, text="ID:", font=('verdana',14), bg='#bdc3c7')
id_entry = tk.Entry(frame, font=('verdana',14))

name_label = tk.Label(frame, text="Name:", font=('verdana',14), bg='#bdc3c7')
name_entry = tk.Entry(frame, font=('verdana',14))

category_label = tk.Label(frame, text="Category:", font=('verdana',14), bg='#bdc3c7')
category_combobox = ttk.Combobox(frame, font=('verdana',14), textvariable=selected,
values=categories)
selected.set(categories[0])

quantity_label = tk.Label(frame, text="Quantity:", font=('verdana',14), bg='#bdc3c7')
quantity_entry = tk.Entry(frame, font=('verdana',14))

price_label = tk.Label(frame, text="Price:", font=('verdana',14), bg='#bdc3c7')
price_entry = tk.Entry(frame, font=('verdana',14))

pic_label = tk.Label(frame, text="Picture:", font=('verdana',14), bg='#bdc3c7')
pic_entry = tk.Entry(frame)
display_pic_label = tk.Label(frame, bg='#bdc3c7')
button_browse_pic = tk.Button(frame, text="Select Image", font=('verdana',14),
bg='#636e72', fg='#ffffff')


search_label = tk.Label(frame, text="Search By Name:", font=('verdana',14),
bg='#bdc3c7')
search_entry = tk.Entry(frame, font=('verdana',14))
button_trv_search = tk.Button(frame, text="Find", font=('verdana',12), bg='orange')


# TreeView
trv = ttk.Treeview(frame, columns=(1,2,3,4,5,6), show='headings')

trv.column(1, anchor=CENTER, stretch=NO, width=100)
trv.column(2, anchor=CENTER, stretch=NO, width=100)
trv.column(3, anchor=CENTER, stretch=NO, width=100)
trv.column(4, anchor=CENTER, stretch=NO, width=100)
trv.column(5, anchor=CENTER, stretch=NO, width=100)
trv.column(6, anchor=CENTER, stretch=NO, width=140)

trv.heading(1, text='ID')
trv.heading(2, text='Name')
trv.heading(3, text='Category')
trv.heading(4, text='Quantity')
trv.heading(5, text='Price')
trv.heading(6, text='Image')


# query buttons
button_add = tk.Button(frame_btns, text="Add", font=('verdana',12), bg='orange')
button_edit = tk.Button(frame_btns, text="Edit", font=('verdana',12), bg='orange')
button_remove = tk.Button(frame_btns, text="Remove", font=('verdana',12), bg='orange')
button_search = tk.Button(frame_btns, text="Search", font=('verdana',12), bg='orange')
# clear entries
button_clear = tk.Button(frame_btns, text="Clear", font=('verdana',12), bg='orange')

# navigation buttons
button_first = tk.Button(frame_btns_nav, text="<<", font=('verdana',14), bg='green',
fg='#ffffff', width=10)
button_last = tk.Button(frame_btns_nav, text=">>", font=('verdana',14), bg='green',
fg='#ffffff', width=10)
button_next = tk.Button(frame_btns_nav, text=">", font=('verdana',14), bg='green',
fg='#ffffff', width=10)
button_previous = tk.Button(frame_btns_nav, text="<", font=('verdana',14), bg='green',
fg='#ffffff', width=10)


frame_main.pack()
frame.grid(row=0, column=0, padx=10, pady=10, sticky='nsew')
id_label.grid(row=0, column=0, sticky='e')
id_entry.grid(row=0, column=1, sticky='w')

name_label.grid(row=1, column=0, sticky='e')
name_entry.grid(row=1, column=1, sticky='w')

category_label.grid(row=2, column=0, sticky='e')
category_combobox.grid(row=2, column=1, sticky='w')

quantity_label.grid(row=3, column=0, sticky='e')
quantity_entry.grid(row=3, column=1, sticky='w')

price_label.grid(row=4, column=0, sticky='e')
price_entry.grid(row=4, column=1, sticky='w')

pic_label.grid(row=5, column=0, sticky='e')
pic_entry.grid(row=5, column=1, sticky='w')
display_pic_label.grid(row=6, column=0, columnspan=2)
button_browse_pic.grid(row=7, column=0, columnspan=2, sticky='nsew')


search_label.grid(row=0, column=3, sticky='e')
search_entry.grid(row=0, column=4, sticky='w')
button_trv_search.grid(row=0, column=5, sticky='nsew')

# add scrollbar to the treeview
sb = Scrollbar(frame, orient=VERTICAL)
trv.config(yscrollcommand=sb.set)
sb.config(command=trv.yview)
trv.grid(row=1, column=3, rowspan=6, columnspan=3, pady=20, sticky='nsew')
sb.grid(row=1, column=6, rowspan=6, sticky='ns', pady=20)

frame_btns.grid(row=8, column=0, columnspan=2, padx=20, pady=20)
button_add.grid(row=0, column=0, padx=5, pady=5)
button_edit.grid(row=0, column=1, padx=5, pady=5)
button_remove.grid(row=0, column=2, padx=5, pady=5)
button_search.grid(row=0, column=3, padx=5, pady=5)
button_clear.grid(row=0, column=4, padx=5, pady=5)

# navigation buttons
frame_btns_nav.grid(row=8, column=3, columnspan=3, padx=20, pady=20)
button_first.grid(row=0, column=0, padx=10)
button_previous.grid(row=0, column=1, padx=10)
button_next.grid(row=0, column=2, padx=10)
button_last.grid(row=0, column=3, padx=10)



# create a function insert a new item
def add():
name = name_entry.get().strip() # .strip() remove white space
category = category_combobox.get().strip()
quantity = quantity_entry.get().strip()
price = price_entry.get().strip()
pic = pic_entry.get().strip()

if(len(name) > 0 and len(category) > 0 and len(quantity) > 0 and len(price) > 0
and len(pic) > 0):
insert_query = "INSERT INTO `products`(`name`, `category`, `quantity`,
`price`, `image_path`) VALUES (%s,%s,%s,%s,%s)"
values = (name, category, quantity, price, pic)
c.execute(insert_query, values)
connection.commit()
messagebox.showinfo('Add', 'Product Added')
displayProducts()
else:
messagebox.showwarning('Add', 'Enter Valid Data')

# set the command to the add button
button_add['command'] = add


# create a function update the selected item
def edit():
p_id = id_entry.get().strip() # .strip() remove white space
name = name_entry.get().strip()
category = category_combobox.get().strip()
quantity = quantity_entry.get().strip()
price = price_entry.get().strip()
pic = pic_entry.get().strip()
if(len(name) > 0 and len(category) > 0 and len(quantity) > 0 and len(price) > 0
and len(pic) > 0):
update_query = "UPDATE `products` SET `name`=%s,`category`=%s,`quantity`=%s,
`price`=%s,`image_path`=%s WHERE `id`=%s"
values = (name, category, quantity, price, pic, p_id)
c.execute(update_query, values)
connection.commit()
messagebox.showinfo('Edit', 'Product Updated')
displayProducts()
else:
messagebox.showwarning('Edit', 'Enter Valid Data')


# set the command to the edit button
button_edit['command'] = edit


# create a function search record by id
def searchById():
p_id = id_entry.get()
search_query = "SELECT * FROM `products` WHERE `id` = " + p_id
c.execute(search_query)
product_data = c.fetchone()

clear()

if product_data:
id_entry.insert(0, product_data[0])
name_entry.insert(0, product_data[1])
category_combobox.insert(0, product_data[2])
quantity_entry.insert(0, product_data[3])
price_entry.insert(0, product_data[4])
pic_entry.insert(0, product_data[5])

# display image
global img
img = Image.open(product_data[5])
img = img.resize((100,100), Image.ANTIALIAS) # resize image
img = ImageTk.PhotoImage(img)
display_pic_label['image'] = img # display image

else:
messagebox.showwarning('No Product','Invalid Product ID')


# set the command to the search button
button_search['command'] = searchById


# create a function remove the selected item
def remove():
p_id = id_entry.get()
try:
delete_query = "DELETE FROM `products` WHERE `id` = " + p_id
c.execute(delete_query)
connection.commit()
messagebox.showinfo('Delete', 'Product Deleted')
displayProducts()
clear()
except:
messagebox.showerror('Error', 'Enter a Valid Product ID')

# set the command to the remove button
button_remove['command'] = remove


# create a function clear all textfields (entries)
def clear():
# clear text
id_entry.delete(0, END)
name_entry.delete(0, END)
category_combobox.delete(0, END)
quantity_entry.delete(0, END)
price_entry.delete(0, END)
pic_entry.delete(0, END)
display_pic_label['image'] = '' # remove image


# set the command to the clear button
button_clear['command'] = clear


# create a function display all records in treeview
def displayProducts():

# clear treeview
for child in trv.get_children():
trv.delete(child)

selectQuery = "SELECT * FROM `products`"
c.execute(selectQuery)
products = c.fetchall()
for row in products:
trv.insert('','end', values=row)


displayProducts()


# create a function search records by name
def searchByName():

# clear treeview
for child in trv.get_children():
trv.delete(child)

val = search_entry.get()
selectQuery = "SELECT * FROM `products` WHERE name like %s"
c.execute(selectQuery, ("%"+val+"%",))
products = c.fetchall()
for row in products:
trv.insert('','end', values=row)


# set the command to the search by name button
button_trv_search['command'] = searchByName


# create a function display the first item
def go_first():
clear()
global p_index
p_index = 0
product = products[p_index]
id_entry.insert(0, product[0])
name_entry.insert(0, product[1])
category_combobox.insert(0, product[2])
quantity_entry.insert(0, product[3])
price_entry.insert(0, product[4])
pic_entry.insert(0, product[5])
# display image
global img
img = Image.open(product[5])
img = img.resize((100,100), Image.ANTIALIAS) # resize image
img = ImageTk.PhotoImage(img)
display_pic_label['image'] = img # display image


# set the command to the show first button
button_first['command'] = go_first


# create a function display the next item
def go_next():
clear()
global p_index
p_index = p_index+1

if p_index > len(products) - 1:
p_index = len(products) - 1

product = products[p_index]
id_entry.insert(0, product[0])
name_entry.insert(0, product[1])
category_combobox.insert(0, product[2])
quantity_entry.insert(0, product[3])
price_entry.insert(0, product[4])
pic_entry.insert(0, product[5])
# display image
global img
img = Image.open(product[5])
img = img.resize((100,100), Image.ANTIALIAS) # resize image
img = ImageTk.PhotoImage(img)
display_pic_label['image'] = img # display image


# set the command to the show next button
button_next['command'] = go_next


# create a function display the previous item
def go_previous():
clear()
global p_index
p_index = p_index-1

if p_index < 0:
p_index = 0

product = products[p_index]
id_entry.insert(0, product[0])
name_entry.insert(0, product[1])
category_combobox.insert(0, product[2])
quantity_entry.insert(0, product[3])
price_entry.insert(0, product[4])
pic_entry.insert(0, product[5])
# display image
global img
img = Image.open(product[5])
img = img.resize((100,100), Image.ANTIALIAS) # resize image
img = ImageTk.PhotoImage(img)
display_pic_label['image'] = img # display image


# set the command to the show previous button
button_previous['command'] = go_previous


# create a function display the last item
def go_last():
clear()
global p_index
p_index = len(products)-1
product = products[p_index]
id_entry.insert(0, product[0])
name_entry.insert(0, product[1])
category_combobox.insert(0, product[2])
quantity_entry.insert(0, product[3])
price_entry.insert(0, product[4])
pic_entry.insert(0, product[5])
# display image
global img
img = Image.open(product[5])
img = img.resize((100,100), Image.ANTIALIAS) # resize image
img = ImageTk.PhotoImage(img)
display_pic_label['image'] = img # display image


# set the command to the show last button
button_last['command'] = go_last



# browse and display image
def selectPicture():
global img
filename = filedialog.askopenfilename(initialdir='/images', title='Select Picture'
, filetypes=(('png images', '*.png'),('jpg images', '*.jpg')))# select image
img = Image.open(filename)
img = img.resize((100,100), Image.ANTIALIAS) # resize image
img = ImageTk.PhotoImage(img)
display_pic_label['image'] = img # display image
pic_entry.delete(0, END) # clear text
pic_entry.insert(0, filename) # display image path



button_browse_pic['command'] = selectPicture


# create a function display the selected item from treeview
def select_Item_From_TreeView(a):
clear()
item = trv.selection()[0]
print(trv.item(item)['values'])
id_entry.insert(0, trv.item(item)['values'][0])
name_entry.insert(0, trv.item(item)['values'][1])
category_combobox.insert(0, trv.item(item)['values'][2])
quantity_entry.insert(0, trv.item(item)['values'][3])
price_entry.insert(0, trv.item(item)['values'][4])
pic_entry.insert(0, trv.item(item)['values'][5])

# display image
global img
img = Image.open(trv.item(item)['values'][5])
img = img.resize((100,100), Image.ANTIALIAS) # resize image
img = ImageTk.PhotoImage(img)
display_pic_label['image'] = img # display image


# set the select command to the treeview
trv.bind('<<TreeviewSelect>>', select_Item_From_TreeView)


root.mainloop()



OUTPUT:

Python project with source code
Python Tkinter MySQL Project - Manage Products

Python project for beginners
Python Tkinter MySQL Project - Get Selected Item From TreeView

Python project step by step
Python Tkinter MySQL Project - Search By Id

Project in Python Tkinter
Python Tkinter MySQL Project - Search By Name



if you want the source code click on the download button below




disclaimer: you will get the source code with the database script and to make it work in your machine is your responsibility and to debug any error/exception is your responsibility this project is for the students who want to see an example and read the code not to get and run.







Share this

Related Posts

Previous
Next Post »