Python Shop Management System Project with Source Code
Master programming with our job-ready courses: Enroll Now
We all go shopping to buy products of our requirement. We all would have observed that the shops are moving towards digital systems for bill computation. In this Python project, we will be building such a shop management system to manage the shop products and bills.
About Shop Management System
Shop management is an application that helps in managing the products and tracking the sales in the shop. This is a project that not only reduces labor and time but also helps the user have a record of the sales in a database.
Shop Management System using Python
We will build this project using the Tkinter and MySQL Connector modules in Python. We use the MySQL Connector to store the details in a table and access them. Using this we will build GUI where the user gets to do the following:
- Add a product
- Delete a product
- View all products
- Generate a bill and store it in a database
Download Python Shop Management System Project
You can download the source code for the project using the link: Shop Management System Project
Project Prerequisites
Prior knowledge on Python, the Tkinter module, and MySQL queries would help the developer while building this project. You can install the above modules using the following commands.
pip install mysql-connector
pip install tkinter
Project File Structure
The following steps are to be followed to build Python shop management system project:
1. Importing the modules
2. Connecting to database and creating tables
3. Creating the main window
4. Function to add product
5. Function to delete product
6. Function to view all products
7. Function to create a new bill
1. Importing the modules
The first step is to import the tkinter and mysql connector modules
#Importing the required modules import tkinter from tkinter import * from tkinter import ttk from tkinter import font from tkinter import messagebox import mysql.connector
Code explanation:
a. font in tkinter is used to set the font of the text.
b. messagebox helps in showing the pop up messages.
2. Connecting to database and creating tables
#Connecting to the database and creating table
db=mysql.connector.connect(user="root",passwd="root",host="localhost")
my_cursor=db.cursor() #getting the cursor object
my_cursor.execute("CREATE DATABASE IF NOT EXISTS Shop") #creating the database named library
db=mysql.connector.connect(user="root",passwd="root",host="localhost",database='Shop')
my_cursor=db.cursor()
#query to create a table products
query="CREATE TABLE IF NOT EXISTS products (date VARCHAR(10),prodName VARCHAR(20), prodPrice VARCHAR(50))"
my_cursor.execute(query) #executing the query
db=mysql.connector.connect(user="root",passwd="root",host="localhost",database='Shop')
my_cursor=db.cursor()
#query to create a table sale
query="CREATE TABLE IF NOT EXISTS sale (custName VARCHAR(20), date VARCHAR(10), prodName VARCHAR(30),qty INTEGER, price INTEGER )"
my_cursor.execute(query) #executing the query
Code explanation:
a. connect(): It is used to connect to the database server on your device using the username and password.
b. cursor(): The cursor object helps in executing the SQL queries.
c. execute(): This executes the command given as input.
3. Creating the main window
Now, we create the main window with buttons to do the following operations:
a. Add a product
b. Delete a product
c. View all products
d. Generate a bill and store it in a database
#Creating the main window
wn = tkinter.Tk()
wn.title("PythonGeeks Shop Management System")
wn.configure(bg='honeydew2')
wn.minsize(width=500,height=500)
wn.geometry("700x600")
headingFrame1 = Frame(wn,bg="snow3",bd=5)
headingFrame1.place(relx=0.2,rely=0.1,relwidth=0.6,relheight=0.16)
headingLabel = Label(headingFrame1, text="Welcome to PythonGeeks \n Shop Management System", fg='grey19', font=('Courier',15,'bold'))
headingLabel.place(relx=0,rely=0, relwidth=1, relheight=1)
#Button to add a new product
btn1 = Button(wn,text="Add a Product",bg='LightBlue1', fg='black', width=20,height=2, command=addProd)
btn1['font'] = font.Font( size=12)
btn1.place(x=270,y=175)
#Button to delete a product
btn2 = Button(wn,text="Delete a Product",bg='misty rose', fg='black',width=20,height=2,command=delProd)
btn2['font'] = font.Font( size=12)
btn2.place(x=270,y=255)
#Button to view all products
btn3 = Button(wn,text="View Products",bg='old lace', fg='black',width=20,height=2,command=viewProds)
btn3['font'] = font.Font( size=12)
btn3.place(x=270,y=335)
#Button to add a new sale and generate bill
btn4 = Button(wn,text="New Customer",bg='lavender blush2', fg='black', width=20,height=2,command = newCust)
btn4['font'] = font.Font( size=12)
btn4.place(x=270,y=415)
wn.mainloop()
Code explanation:
a. title(): It displays the title on the top of the window.
b. config(): It sets the background color of the window.
c. geometry(): It sets the length and width of the window.
d. Frame(): It creates a Frame, a rectangular object that holds various widgets, on the screen.
e. place(): This is used to locate the widgets in a particular position based on coordinates or relative to the parent component.
f. Label(): This creates a label to show text.
g. Button(): This creates a button with mentioned properties and the command parameter represents the function that executed on pressing the button.
h. mainloop(): This makes sure the screen runs till manually closed by the user.
4. Function to add product
In this step, we create a window to take input of product details from the user and then add it to the database.
#Function to add the product to the database
def prodtoTable():
#Getting the user inputs of product details from the user
pname= prodName.get()
price = prodPrice.get()
dt = date.get()
#Connecting to the database
db=mysql.connector.connect(user="root",passwd="root",host="localhost",database='Shop')
cursor = db.cursor()
#query to add the product details to the table
query = "INSERT INTO products(date,prodName,prodPrice) VALUES(%s,%s,%s)"
details = (dt,pname,price)
#Executing the query and showing the pop up message
try:
cursor.execute(query,details)
db.commit()
messagebox.showinfo('Success',"Product added successfully")
except Exception as e:
print("The exception is:",e)
messagebox.showinfo("Error","Trouble adding data into Database")
wn.destroy()
#Function to get details of the product to be added
def addProd():
global prodName, prodPrice, date, Canvas1, wn
#Creating the window
wn = tkinter.Tk()
wn.title("PythonGeeks Shop Management System")
wn.configure(bg='mint cream')
wn.minsize(width=500,height=500)
wn.geometry("700x600")
Canvas1 = Canvas(wn)
Canvas1.config(bg='LightBlue1')
Canvas1.pack(expand=True,fill=BOTH)
headingFrame1 = Frame(wn,bg='LightBlue1',bd=5)
headingFrame1.place(relx=0.25,rely=0.1,relwidth=0.5,relheight=0.13)
headingLabel = Label(headingFrame1, text="Add a Product", fg='grey19', font=('Courier',15,'bold'))
headingLabel.place(relx=0,rely=0, relwidth=1, relheight=1)
labelFrame = Frame(wn)
labelFrame.place(relx=0.1,rely=0.4,relwidth=0.8,relheight=0.4)
# Getting Date
lable1 = Label(labelFrame,text="Date : ", fg='black')
lable1.place(relx=0.05,rely=0.3, relheight=0.08)
date = Entry(labelFrame)
date.place(relx=0.3,rely=0.3, relwidth=0.62, relheight=0.08)
# Product Name
lable2 = Label(labelFrame,text="Product Name : ", fg='black')
lable2.place(relx=0.05,rely=0.45, relheight=0.08)
prodName = Entry(labelFrame)
prodName.place(relx=0.3,rely=0.45, relwidth=0.62, relheight=0.08)
# Product Price
lable3 = Label(labelFrame,text="Product Price : ", fg='black')
lable3.place(relx=0.05,rely=0.6, relheight=0.08)
prodPrice = Entry(labelFrame)
prodPrice.place(relx=0.3,rely=0.6, relwidth=0.62, relheight=0.08)
#Add Button
Btn = Button(wn,text="ADD",bg='#d1ccc0', fg='black',command=prodtoTable)
Btn.place(relx=0.28,rely=0.85, relwidth=0.18,relheight=0.08)
Quit= Button(wn,text="Quit",bg='#f7f1e3', fg='black',command=wn.destroy)
Quit.place(relx=0.53,rely=0.85, relwidth=0.18,relheight=0.08)
wn.mainloop()
Code explanation:
a. title(): It displays the title on the top of the window.
b. config(): It sets the background color of the window.
c. geometry(): It sets the length and width of the window.
d. Frame(): It creates a Frame, a rectangular object that holds various widgets, on the screen.
e. place(): This is used to locate the widgets in a particular position based on coordinates or relative to the parent component.
f. Label(): This creates a label to show text.
g. Entry(): This widget takes the input from the user.
h. Button(): This creates a button with mentioned properties and the command parameter represents the function executed on pressing the button.
i. mainloop(): This makes sure the screen runs till manually closed by the user.
j. connect(): It is used to connect to the database server on your device using the username and password.
k. cursor(): The cursor object helps in executing the SQL queries.
l. execute(): This executes the command given as input.
5. Function to delete product
In this step, we create a window to take input of product name from the user. And then delete the details of that product from the database.
#Function to remove the product from the database
def removeProd():
#Getting the product name from the user to be removed
name = prodName.get()
name = name.lower()
#Connecting to the database
db=mysql.connector.connect(user="root",passwd="root",host="localhost",database='Shop')
cursor = db.cursor()
#Query to delete the respective product from the database
query = "DELETE from products where LOWER(prodName) = '"+name+"'"
#Executing the query and showing the message box
try:
cursor.execute(query)
db.commit()
#cur.execute(deleteIssue)
#con.commit()
messagebox.showinfo('Success',"Product Record Deleted Successfully")
except Exception as e:
print("The exception is:",e)
messagebox.showinfo("Please check Product Name")
wn.destroy()
#Function to get product details from the user to be deleted
def delProd():
global prodName, Canvas1, wn
#Creating a window
wn = tkinter.Tk()
wn.title("PythonGeeks Shop Management System")
wn.configure(bg='mint cream')
wn.minsize(width=500,height=500)
wn.geometry("700x600")
Canvas1 = Canvas(wn)
Canvas1.config(bg="misty rose")
Canvas1.pack(expand=True,fill=BOTH)
headingFrame1 = Frame(wn,bg="misty rose",bd=5)
headingFrame1.place(relx=0.25,rely=0.1,relwidth=0.5,relheight=0.13)
headingLabel = Label(headingFrame1, text="Delete Product", fg='grey19', font=('Courier',15,'bold'))
headingLabel.place(relx=0,rely=0, relwidth=1, relheight=1)
labelFrame = Frame(wn)
labelFrame.place(relx=0.1,rely=0.3,relwidth=0.8,relheight=0.5)
# Product Name to Delete
lable = Label(labelFrame,text="Product Name : ", fg='black')
lable.place(relx=0.05,rely=0.5)
prodName = Entry(labelFrame)
prodName.place(relx=0.3,rely=0.5, relwidth=0.62)
#Delete Button
Btn = Button(wn,text="DELETE",bg='#d1ccc0', fg='black',command=removeProd)
Btn.place(relx=0.28,rely=0.9, relwidth=0.18,relheight=0.08)
Quit = Button(wn,text="Quit",bg='#f7f1e3', fg='black', command=wn.destroy)
Quit.place(relx=0.53,rely=0.9, relwidth=0.18,relheight=0.08)
wn.mainloop()
Code explanation:
a. title(): It displays the title on the top of the window.
b. config(): It sets the background color of the window.
c. geometry(): It sets the length and width of the window.
d. Frame(): It creates a Frame, a rectangular object that holds various widgets, on the screen.
e. place(): This is used to locate the widgets in a particular position based on coordinates or relative to the parent component.
f. Label(): This creates a label to show text.
g. Entry(): This widget takes the input from the user.
h. Button(): This creates a button with mentioned properties and the command parameter represents the function executed on pressing the button.
i. mainloop(): This makes sure the screen runs till manually closed by the user.
j. connect(): It is used to connect to the database server on your device using the username and password.
k. cursor(): The cursor object helps in executing the SQL queries.
l. execute(): This executes the command given as input.
6. Function to view all products
In this step we connect to the database, get the details of all the products and show them on the screen.
#Function to show all the products in the database
def viewProds():
global wn
#Creating the window to show the products details
wn = tkinter.Tk()
wn.title("PythonGeeks Shop Management System")
wn.configure(bg='mint cream')
wn.minsize(width=500,height=500)
wn.geometry("700x600")
Canvas1 = Canvas(wn)
Canvas1.config(bg="old lace")
Canvas1.pack(expand=True,fill=BOTH)
headingFrame1 = Frame(wn,bg='old lace',bd=5)
headingFrame1.place(relx=0.25,rely=0.1,relwidth=0.5,relheight=0.13)
headingLabel = Label(headingFrame1, text="View Products", fg='black', font = ('Courier',15,'bold'))
headingLabel.place(relx=0,rely=0, relwidth=1, relheight=1)
labelFrame = Frame(wn)
labelFrame.place(relx=0.1,rely=0.3,relwidth=0.8,relheight=0.5)
y = 0.25
#Connecting to database
db=mysql.connector.connect(user="root",passwd="root",host="localhost",database='Shop')
cursor=db.cursor()
#query to select all products from the table
query = 'SELECT * FROM products'
Label(labelFrame, text="%-50s%-50s%-50s"%('Date','Product','Price'),font = ('calibri',11,'bold'),
fg='black').place(relx=0.07,rely=0.1)
Label(labelFrame, text = "----------------------------------------------------------------------------",fg='black').place (relx=0.05,rely=0.2)
#Executing the query and showing the products details
try:
cursor.execute(query)
res = cursor.fetchall()
for i in res:
Label(labelFrame,text="%-50s%-50s%-50s"%(i[0],i[1],i[2]) ,fg='black').place(relx=0.07,rely=y)
y += 0.1
except Exception as e:
print("The exception is:",e)
messagebox.showinfo("Failed to fetch files from database")
Quit= Button(wn,text="Quit",bg='#f7f1e3', fg='black', command=wn.destroy)
Quit.place(relx=0.4,rely=0.9, relwidth=0.18,relheight=0.08)
wn.mainloop()
Code explanation:
a. title(): It displays the title on the top of the window.
b. config(): It sets the background color of the window.
c. geometry(): It sets the length and width of the window.
d. Frame(): It creates a Frame, a rectangular object that holds various widgets, on the screen.
e. place(): This is used to locate the widgets in a particular position based on coordinates or relative to the parent component.
f. Label(): This creates a label to show text.
g. Entry(): This widget takes the input from the user.
h. Button(): This creates a button with mentioned properties and the command parameter represents the function that executed on pressing the button.
i. mainloop(): This makes sure the screen runs till manually closed by the user.
j. connect(): It is used to connect to the database server on your device using the username and password.
k. cursor(): The cursor object helps in executing the SQL queries.
l. execute(): This executes the command given as input.
7. Function to create a new bill
In this step we create a window to take input of quantities for each product to be brought. If not required to buy, that entry is left empty. Then on clicking the button to generate a bill, we calculate the price and show the final bill details from the user.
#Function to generate the bill
def bill():
#Creating a window
wn = tkinter.Tk()
wn.title("PythonGeeks Shop Management System")
wn.configure(bg='lavender blush2')
wn.minsize(width=500,height=500)
wn.geometry("700x600")
headingFrame1 = Frame(wn,bg="lavender blush2",bd=5)
headingFrame1.place(relx=0.2,rely=0.1,relwidth=0.6,relheight=0.16)
headingLabel = Label(headingFrame1, text="Bill", fg='grey19', font=('Courier',15,'bold'))
headingLabel.place(relx=0,rely=0, relwidth=1, relheight=1)
labelFrame = Frame(wn)
labelFrame.place(relx=0.1,rely=0.3,relwidth=0.8,relheight=0.5)
y = 0.35
Label(labelFrame, text="%-40s%-40s%-40s%-40s"%('Product','Price','Quantity','Total'),font = ('calibri',11,'bold'),
fg='black').place(relx=0.07,rely=0.2)
#Getting date and customer name
dt=date.get()
cName=custName.get()
totalBill=0
#Connecting to database
db=mysql.connector.connect(user="root",passwd="root",host="localhost",database='Shop')
cursor=db.cursor()
#query to select all the products
query = 'SELECT * FROM products'
#Checking if the quantity of the 1st product is entered and calculating price, showing it on window and adding to database
if(len(name1.get()) != 0):
i=res[0]
qty=int(name1.get())
total=qty*int(i[2])
Label(labelFrame,text="%-40s%-40s%-40s%-40s"%(i[1],i[2],qty,total) ,fg='black').place(relx=0.07,rely=y)
totalBill+=total
y+=0.1
query = "INSERT INTO sale(custName,date,prodName,qty,price) VALUES(%s,%s,%s,%s,%s)"
details = (cName,dt,i[1],qty,total)
#Checking if the quantity of the 2nd product is entered and calculating price, showing it on window and adding to database
if(len(name2.get()) != 0):
i=res[1]
qty=int(name2.get())
total=qty*int(i[2])
Label(labelFrame,text="%-40s%-40s%-40s%-40s"%(i[1],i[2],qty,total) ,fg='black').place(relx=0.07,rely=y)
totalBill+=total
y+=0.1
query = "INSERT INTO sale(custName,date,prodName,qty,price) VALUES(%s,%s,%s,%s,%s)"
details = (cName,dt,i[1],qty,total)
#Checking if the quantity of the 3rd product is entered and calculating price, showing it on window and adding to database
if(len(name3.get()) != 0):
i=res[2]
qty=int(name3.get())
total=qty*int(i[2])
Label(labelFrame,text="%-40s%-40s%-40s%-40s"%(i[1],i[2],qty,total) ,fg='black').place(relx=0.07,rely=y)
totalBill+=total
y+=0.1
query = "INSERT INTO sale(custName,date,prodName,qty,price) VALUES(%s,%s,%s,%s,%s)"
details = (cName,dt,i[1],qty,total)
#showing total of the bill
Label(labelFrame, text = "------------------------------------------------------------------------------------",fg='black').place (relx=0.05,rely=y)
y+=0.1
Label(labelFrame,text="\t\t\t\t\t\t\t\t"+str(totalBill) ,fg='black').place(relx=0.07,rely=y)
Quit = Button(wn,text="Quit",bg='#f7f1e3', fg='black', command=wn.destroy)
Quit.place(relx=0.53,rely=0.9, relwidth=0.18,relheight=0.08)
wn.mainloop()
#Function to take the inputs form the user to generate bill
def newCust():
global wn,name1,name2,name3,date,custName
#Creating a window
wn = tkinter.Tk()
wn.title("PythonGeeks Shop Management System")
wn.configure(bg='lavender blush2')
wn.minsize(width=500,height=500)
wn.geometry("700x600")
headingFrame1 = Frame(wn,bg="lavender blush2",bd=5)
headingFrame1.place(relx=0.2,rely=0.1,relwidth=0.6,relheight=0.16)
headingLabel = Label(headingFrame1, text="New Customer", fg='grey19', font=('Courier',15,'bold'))
headingLabel.place(relx=0,rely=0, relwidth=1, relheight=1)
lable1 = Label(wn,text="Date : ", fg='black')
lable1.place(relx=0.05,rely=0.3, )
#Getting date
date = Entry(wn)
date.place(relx=0.3,rely=0.3, relwidth=0.62)
lable2 = Label(wn,text="Customer Name : ", fg='black')
lable2.place(relx=0.05,rely=0.4, )
#Getting customer name
custName = Entry(wn)
custName.place(relx=0.3,rely=0.4, relwidth=0.62)
labelFrame = Frame(wn)
labelFrame.place(relx=0.1,rely=0.45,relwidth=0.8,relheight=0.4)
y = 0.3
Label(labelFrame, text="Please enter the quantity of the products you want to buy",font = ('calibri',11,'bold'),
fg='black').place(relx=0.07,rely=0.1)
Label(labelFrame, text="%-50s%-50s%-30s"%('Product','Price','Quantity'),font = ('calibri',11,'bold'),
fg='black').place(relx=0.07,rely=0.2)
#Connecting to the database
db=mysql.connector.connect(user="root",passwd="root",host="localhost",database='Shop')
cursor=db.cursor()
query = 'SELECT * FROM products'
cursor.execute(query)
res = cursor.fetchall()
print(res)
c=1
#Showing all the products and creating entries to take the input of the quantity
i=res[0]
Label(labelFrame,text="%-50s%-50s"%(i[1],i[2]) ,fg='black').place(relx=0.07,rely=y)
name1 = Entry(labelFrame)
name1.place(relx=0.6,rely=y, relwidth=0.2)
y += 0.1
i=res[1]
Label(labelFrame,text="%-50s%-50s"%(i[1],i[2]) ,fg='black').place(relx=0.07,rely=y)
name2 = Entry(labelFrame)
name2.place(relx=0.6,rely=y, relwidth=0.2)
y += 0.1
i=res[2]
Label(labelFrame,text="%-50s%-50s"%(i[1],i[2]) ,fg='black').place(relx=0.07,rely=y)
name3 = Entry(labelFrame)
name3.place(relx=0.6,rely=y, relwidth=0.2)
y += 0.1
#Button to generate bill
Btn= Button(wn,text="Generate Bill",bg='#d1ccc0', fg='black',command=bill)
Btn.place(relx=0.28,rely=0.9, relwidth=0.18,relheight=0.08)
Quit = Button(wn,text="Quit",bg='#f7f1e3', fg='black', command=wn.destroy)
Quit.place(relx=0.55,rely=0.9, relwidth=0.18,relheight=0.08)
wn.mainloop()
Code explanation:
a. title(): It displays the title on the top of the window.
b. config(): It sets the background color of the window.
c. geometry(): It sets the length and width of the window.
d. Frame(): It creates a Frame, a rectangular object that holds various widgets, on the screen.
e. place(): This is used to locate the widgets in a particular position based on coordinates or relative to the parent component.
f. Label(): This creates a label to show text.
g. Entry(): This widget takes the input from the user.
h. Button(): This creates a button with mentioned properties and the command parameter represents the function executed on pressing the button.
i. mainloop(): This makes sure the screen runs till manually closed by the user.
j. connect(): It is used to connect to the database server on your device using the username and password.
k. cursor(): The cursor object helps in executing the SQL queries.
l. execute(): This executes the command given as input
Output of Python Shop Management System Project
Fig 1. The image of the main window
Fig 2. The image of viewing all the products
Fig 3. The image of showing adding a product to a bill
Fig 4. The image of a bill generated
Summary
Hurray! We have successfully built the Shop Management System project using Python. We got to use the Tkinter and mysql connector modules. Hope you enjoyed building with us!





error name res is not defined
please tell how can we you solve this error
Line 353 in newcast i=res[2]
Index error: list index out of range
Explan the res details in bill statment
the buttons in the window are not working
please tell how can we solve this error
My features project
00
there is mistake in view products nd generate bill
Exception has occurred: InterfaceError
2003: Can’t connect to MySQL server on ‘localhost:3306’ (10061 No connection could be made because the target machine actively refused it)
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it
Can you plz add a search button in this project for searching products
It was a usefull project but i have a request can you plz add a search btn for searching product?
Add a search button in this project
CAN YOU MAKE ABOUT GROCERY SHOPPING ASSISTANT?THANKYOU!
Jewelry shop billing to python
Some modules are not defined
inventory = {
‘Kurtis size S’: {‘S’: 10,},
‘Kurtis size M’: {‘M’: 25},
‘Kurtis size L’: {‘L’: 38},
‘Dress Material’: {‘Free Size’: 12},
‘Top size S’: {‘S’: 15,},
‘Top size M’: {‘M’: 20,},
‘Top size L’: {‘L’: 20,},
‘Ready made dress size M’: {‘M’: 17,},
‘Ready made dress size L’: {‘L’:20},
‘Ready made dress size XL’: {‘XL’:20}
}
how do i enter this
bro i need production management system using python can you give me the source code for my internship report
Store management keep track of Inventory
super project for grocery management system