Python超市收银系统
时间: 2023-11-29 22:46:20 浏览: 197
以下是一个简单的Python超市收银系统的例子:
```python
# 导入必要的库
import tkinter as tk
import tkinter.messagebox as msgbox
import sqlite3
# 连接数据库
conn = sqlite3.connect('market.db')
c = conn.cursor()
# 创建商品表
c.execute('''CREATE TABLE IF NOT EXISTS products
(id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
barcode TEXT NOT NULL,
price REAL NOT NULL,
quantity INTEGER NOT NULL)''')
# 创建用户表
c.execute('''CREATE TABLE IF NOT EXISTS users
(id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
password TEXT NOT NULL,
is_admin INTEGER NOT NULL)''')
# 插入管理员用户
c.execute("INSERT OR IGNORE INTO users (username, password, is_admin) VALUES (?, ?, ?)", ('admin', 'admin', 1))
# 提交更改
conn.commit()
# 创建主窗口
root = tk.Tk()
root.title('超市收银系统')
# 创建登录窗口
class LoginWindow:
def __init__(self, master):
self.master = master
self.master.title('登录')
self.master.geometry('300x200')
self.master.resizable(False, False)
# 创建用户名和密码标签和输入框
tk.Label(self.master, text='用户名:').grid(row=0, column=0, padx=10, pady=10)
self.username_entry = tk.Entry(self.master)
self.username_entry.grid(row=0, column=1, padx=10, pady=10)
tk.Label(self.master, text='密码:').grid(row=1, column=0, padx=10, pady=10)
self.password_entry = tk.Entry(self.master, show='*')
self.password_entry.grid(row=1, column=1, padx=10, pady=10)
# 创建登录和退出按钮
tk.Button(self.master, text='登录', command=self.login).grid(row=2, column=0, padx=10, pady=10)
tk.Button(self.master, text='退出', command=self.master.destroy).grid(row=2, column=1, padx=10, pady=10)
# 登录函数
def login(self):
# 获取用户名和密码
username = self.username_entry.get()
password = self.password_entry.get()
# 查询用户
c.execute("SELECT * FROM users WHERE username=? AND password=?", (username, password))
user = c.fetchone()
# 判断用户是否存在
if user is None:
msgbox.showerror('错误', '用户名或密码错误!')
else:
# 判断用户是否为管理员
if user[3] == 1:
AdminWindow(self.master)
else:
UserWindow(self.master)
# 创建管理员窗口
class AdminWindow:
def __init__(self, master):
self.master = master
self.master.title('管理员界面')
self.master.geometry('500x400')
self.master.resizable(False, False)
# 创建商品列表
self.product_list = tk.Listbox(self.master, width=50)
self.product_list.grid(row=0, column=0, columnspan=2, padx=10, pady=10)
# 查询商品
c.execute("SELECT * FROM products")
products = c.fetchall()
# 显示商品
for product in products:
self.product_list.insert(tk.END, f'{product[1]} - {product[2]} - ¥{product[3]} - 库存:{product[4]}')
# 创建添加商品按钮
tk.Button(self.master, text='添加商品', command=self.add_product).grid(row=1, column=0, padx=10, pady=10)
# 创建修改商品按钮
tk.Button(self.master, text='修改商品', command=self.edit_product).grid(row=1, column=1, padx=10, pady=10)
# 创建查询商品按钮
tk.Button(self.master, text='查询商品', command=self.search_product).grid(row=2, column=0, padx=10, pady=10)
# 创建退出按钮
tk.Button(self.master, text='退出', command=self.master.destroy).grid(row=2, column=1, padx=10, pady=10)
# 添加商品函数
def add_product(self):
# 创建添加商品窗口
add_product_window = tk.Toplevel(self.master)
add_product_window.title('添加商品')
add_product_window.geometry('300x200')
add_product_window.resizable(False, False)
# 创建商品名称、条码、价格和数量标签和输入框
tk.Label(add_product_window, text='商品名称:').grid(row=0, column=0, padx=10, pady=10)
name_entry = tk.Entry(add_product_window)
name_entry.grid(row=0, column=1, padx=10, pady=10)
tk.Label(add_product_window, text='商品条码:').grid(row=1, column=0, padx=10, pady=10)
barcode_entry = tk.Entry(add_product_window)
barcode_entry.grid(row=1, column=1, padx=10, pady=10)
tk.Label(add_product_window, text='商品价格:').grid(row=2, column=0, padx=10, pady=10)
price_entry = tk.Entry(add_product_window)
price_entry.grid(row=2, column=1, padx=10, pady=10)
tk.Label(add_product_window, text='商品数量:').grid(row=3, column=0, padx=10, pady=10)
quantity_entry = tk.Entry(add_product_window)
quantity_entry.grid(row=3, column=1, padx=10, pady=10)
# 创建添加按钮
tk.Button(add_product_window, text='添加', command=lambda: self.add_product_to_database(name_entry.get(), barcode_entry.get(), price_entry.get(), quantity_entry.get(), add_product_window)).grid(row=4, column=0, padx=10, pady=10)
# 添加商品到数据库函数
def add_product_to_database(self, name, barcode, price, quantity, window):
# 判断商品是否已存在
c.execute("SELECT * FROM products WHERE barcode=?", (barcode,))
product = c.fetchone()
if product is None:
# 插入商品
c.execute("INSERT INTO products (name, barcode, price, quantity) VALUES (?, ?, ?, ?)", (name, barcode, price, quantity))
conn.commit()
# 更新商品列表
self.product_list.insert(tk.END, f'{name} - {barcode} - ¥{price} - 库存:{quantity}')
# 关闭添加商品窗口
window.destroy()
else:
msgbox.showerror('错误', '商品已存在!')
# 修改商品函数
def edit_product(self):
# 获取选中的商品
selected_product = self.product_list.curselection()
if len(selected_product) == 0:
msgbox.showerror('错误', '请选择要修改的商品!')
else:
# 获取选中的商品信息
product_info = self.product_list.get(selected_product[0])
product_name, product_barcode, product_price, product_quantity = product_info.split(' - ')
# 创建修改商品窗口
edit_product_window = tk.Toplevel(self.master)
edit_product_window.title('修改商品')
edit_product_window.geometry('300x200')
edit_product_window.resizable(False, False)
# 创建商品名称、条码、价格和数量标签和输入框
tk.Label(edit_product_window, text='商品名称:').grid(row=0, column=0, padx=10, pady=10)
name_entry = tk.Entry(edit_product_window)
name_entry.insert(tk.END, product_name)
name_entry.grid(row=0, column=1, padx=10, pady=10)
tk.Label(edit_product_window, text='商品条码:').grid(row=1, column=0, padx=10, pady=10)
barcode_entry = tk.Entry(edit_product_window)
barcode_entry.insert(tk.END, product_barcode)
barcode_entry.grid(row=1, column=1, padx=10, pady=10)
tk.Label(edit_product_window, text='商品价格:').grid(row=2, column=0, padx=10, pady=10)
price_entry = tk.Entry(edit_product_window)
price_entry.insert(tk.END, product_price[1:])
price_entry.grid(row=2, column=1, padx=10, pady=10)
tk.Label(edit_product_window, text='商品数量:').grid(row=3, column=0, padx=10, pady=10)
quantity_entry = tk.Entry(edit_product_window)
quantity_entry.insert(tk.END, product_quantity.split(':')[1])
quantity_entry.grid(row=3, column=1, padx=10, pady=10)
# 创建修改按钮
tk.Button(edit_product_window, text='修改', command=lambda: self.edit_product_in_database(selected_product[0], name_entry.get(), barcode_entry.get(), price_entry.get(), quantity_entry.get(), edit_product_window)).grid(row=4, column=0, padx=10, pady=10)
# 修改商品在数据库中的信息函数
def edit_product_in_database(self, index, name, barcode, price, quantity, window):
# 更新商品
c.execute("UPDATE products SET name=?, barcode=?, price=?, quantity=? WHERE id=?", (name, barcode, price, quantity, index + 1))
conn.commit()
# 更新商品列表
self.product_list.delete(index)
self.product_list.insert(index, f'{name} - {barcode} - ¥{price} - 库存:{quantity}')
# 关闭修改商品窗口
window.destroy()
# 查询商品函数
def search_product(self):
# 创建查询商品窗口
search_product_window = tk.Toplevel(self.master)
search_product_window.title('查询商品')
search_product_window.geometry('300x200')
search_product_window.resizable(False, False)
# 创建查询标签和输入框
tk.Label(search_product_window, text='查询:').grid(row=0, column=0, padx=10, pady=10)
search_entry = tk.Entry(search_product_window)
search_entry.grid(row=0, column=1, padx=10, pady=10)
# 创建查询按钮
tk.Button(search_product_window, text='查询', command=lambda: self.search_product_in_database(search_entry.get(), search_product_window)).grid(row=1, column=0, padx=10, pady=10)
# 在数据库中查询商品函数
def search_product_in_database(self, keyword, window):
# 查询商品
c.execute("SELECT * FROM products WHERE name LIKE ? OR barcode LIKE ?", (f'%{keyword}%', f'%{keyword}%'))
products = c.fetchall()
# 显示商品
self.product_list.delete(0, tk.END)
for product in products:
self.product_list.insert(tk.END, f'{product[1]} - {product[2]} - ¥{product[3]} - 库存:{product[4]}')
# 关闭查询商品窗口
window.destroy()
# 创建普通用户窗口
class UserWindow:
def __init__(self, master):
self.master = master
self.master.title('用户界面')
self.master.geometry('500x400')
self.master.resizable(False, False)
# 创建商品列表
self.product_list = tk.Listbox(self.master, width=50)
self.product_list.grid(row=0, column=0, columnspan=2, padx=10, pady=10)
# 查询商品
c.execute("SELECT * FROM products")
products = c.fetchall()
# 显示商品
for product in products:
self.product_list.insert(tk.END, f'{product[1]} - {product[2]} - ¥{product[3]} - 库存:{product[4]}')
# 创建查询商品按钮
tk.Button(self.master, text='查询商品', command=self.search_product).grid(row=1, column=0, padx=10, pady=10)
# 创建退出按钮
tk.Button(self.master, text='退出', command=self.master.destroy).grid(row=1, column=1, padx=10, pady=10)
# 查询商品函数
def search_product(self):
# 创建查询商品窗口
search_product_window = tk.Toplevel(self.master)
search_product_window.title('查询商品')
search_product_window.geometry('300x200')
search_product_window.resizable(False, False)
# 创建查询标签和输入框
tk.Label(search_product_window, text='查询:').grid(row=0, column=0, padx=10, pady=10)
search_entry = tk.Entry(search_product_window)
search_entry.grid(row=0, column=1, padx=10, pady=10)
# 创建查询按钮
tk.Button(search_product_window, text='查询', command=lambda: self.search_product_in_database(search_entry.get(), search_product_window)).grid(row=1, column=0, padx=10, pady=10)
# 在数据库中查询商品函数
def search_product_in_database(self, keyword, window):
# 查询商品
c.execute("SELECT * FROM products WHERE name LIKE ? OR barcode LIKE ?", (f'%{keyword}%', f'%{keyword}%'))
products = c.fetchall()
# 显示商品
self.product_list.delete(0, tk.END)
for product in products:
self.product_list.insert(tk.END, f'{product[1]} - {product[2]} - ¥{product[3]} - 库存:{product[4]}')
# 关闭查询商品窗口
window.destroy()
# 创建登录窗口
LoginWindow(root)
# 运行主循环
root.mainloop()
```
阅读全文