You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
7.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import tkinter as tk
from tkinter import messagebox
from tkinter import simpledialog
# 假设有一个UserDB类用于数据库操作这里简化处理
class UserDB:
@staticmethod
def user_exists(username):
# 实际情况下,这里应该查询数据库
return False
@staticmethod
def user_login(username, password):
# 实际情况下,这里应该从数据库查询用户信息并验证密码
# 返回True表示验证成功False表示失败
return True if username == "test" and password == "test" else False # 示例验证逻辑,实际应用需替换
# 假设的商品列表
PRODUCTS = [
{"id": 1, "name": "商品A", "price": 100},
{"id": 2, "name": "商品B", "price": 200},
# 添加更多商品...
]
# 购物车数据结构,使用字典方便统计商品数量
SHOPPING_CART = {}
class ShoppingCartSystem(tk.Tk):
def __init__(self):
super().__init__()
self.title("购物车系统")
self.geometry("400x300")
self.create_menu()
def create_menu(self):
buttons_frame = tk.Frame(self)
buttons_frame.pack(pady=20)
tk.Button(buttons_frame, text="注册", command=self.register).pack(pady=5)
tk.Button(buttons_frame, text="登录", command=self.login).pack(pady=5)
tk.Button(buttons_frame, text="购物", command=self.shopping).pack(pady=5)
tk.Button(buttons_frame, text="结账", command=self.checkout).pack(pady=5)
tk.Button(buttons_frame, text="退货", command=self.return_goods).pack(pady=5)
tk.Button(buttons_frame, text="消费记录", command=self.shopping_history).pack(pady=5)
tk.Button(buttons_frame, text="退出", command=self.quit).pack(pady=5)
def register(self):
# 弹出对话框收集用户输入
username = simpledialog.askstring("注册", "请输入用户名:")
password = simpledialog.askstring("注册", "请输入密码:", show='*')
confirm_password = simpledialog.askstring("注册", "请再次输入密码:", show='*')
# 简单的输入验证
if not username or not password or not confirm_password:
messagebox.showerror("错误", "所有字段都需要填写!")
return
if password != confirm_password:
messagebox.showerror("错误", "两次输入的密码不一致!")
return
if UserDB.user_exists(username):
messagebox.showerror("错误", "用户名已存在!")
return
# 保存用户信息到数据库
UserDB.add_user(username, password)
messagebox.showinfo("成功", "注册成功!")
def login(self):
# 弹出对话框收集用户输入
username = simpledialog.askstring("登录", "请输入用户名:")
password = simpledialog.askstring("登录", "请输入密码:", show='*')
# 验证用户名和密码
if not username or not password:
messagebox.showerror("错误", "用户名和密码都是必填项!")
return
if UserDB.user_login(username, password):
messagebox.showinfo("成功", f"欢迎,{username}!登录成功。")
# 实际应用中可能需要在这里实现页面跳转逻辑
else:
messagebox.showerror("错误", "用户名或密码错误,请重试。")
def shopping(self):
# 简化处理,展示商品列表并让用户选择商品添加到购物车
selected_product_id = simpledialog.askinteger("购物", "请选择商品编号例如1", minvalue=1,
maxvalue=len(PRODUCTS))
if selected_product_id is not None:
selected_product = PRODUCTS[selected_product_id - 1]
product_info = f"商品名:{selected_product['name']},价格:{selected_product['price']}"
# 提示用户确认是否添加到购物车
response = messagebox.askyesno("确认添加", f"是否将商品 {selected_product['name']} 添加到购物车?")
if response:
# 添加商品到购物车
if selected_product['id'] in SHOPPING_CART:
SHOPPING_CART[selected_product['id']]['quantity'] += 1
else:
SHOPPING_CART[selected_product['id']] = {'name': selected_product['name'],
'price': selected_product['price'], 'quantity': 1}
messagebox.showinfo("成功", f"已将 {selected_product['name']} 添加到购物车!")
else:
messagebox.showinfo("取消", "操作已取消。")
def checkout(self):
if not SHOPPING_CART:
messagebox.showinfo("提示", "购物车为空,请先添加商品!")
return
# 计算总价
total_price = sum(item['price'] * item['quantity'] for item in SHOPPING_CART.values())
# 展示结账信息
cart_details = "\n".join(
[f"{item['name']} x {item['quantity']} = {item['price'] * item['quantity']}" for item in
SHOPPING_CART.values()])
checkout_message = f"您的购物车商品清单:\n{cart_details}\n总计: {total_price}"
# 使用messagebox显示结账信息这里仅作为演示实际应用中可能需要更复杂的界面
response = messagebox.askyesno("结账确认", checkout_message)
if response:
# 清空购物车(实际应用中可能需要在服务器端同步此操作)
SHOPPING_CART.clear()
messagebox.showinfo("成功", "结账成功,感谢您的购买!")
else:
messagebox.showinfo("取消", "结账已取消。")
def return_goods(self):
if not SHOPPING_CART:
messagebox.showinfo("提示", "购物车为空,没有商品可以退货!")
return
# 构建退货选择界面的逻辑
def on_return_selected():
# 获取用户选择的索引
selected_indices = list_box.curselection()
if not selected_indices:
messagebox.showinfo("提示", "请至少选择一项商品进行退货!")
return
# 从购物车移除选中的商品
for index in reversed(selected_indices):
item_index = int(list_box.get(index).split(' ')[0]) # 假设列表显示为 "序号 商品名 x 数量 = 总价元"
del SHOPPING_CART[item_index] # 这里直接根据商品ID序号移除实际情况可能需要更复杂的匹配逻辑
messagebox.showinfo("成功", "退货成功!已从购物车移除选中商品。")
return_window.destroy() # 关闭退货窗口
return_window = tk.Toplevel(self)
return_window.title("选择退货商品")
return_window.geometry("400x300")
list_box_scrollbar = tk.Scrollbar(return_window)
list_box = tk.Listbox(return_window, yscrollcommand=list_box_scrollbar.set)
list_box.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
list_box_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
list_box_scrollbar.config(command=list_box.yview)
# 将购物车中的商品添加到列表供选择
for idx, (item_id, item_data) in enumerate(SHOPPING_CART.items(), start=1):
item_str = f"{idx} {item_data['name']} x {item_data['quantity']} = {item_data['price'] * item_data['quantity']}"
list_box.insert(tk.END, item_str)
tk.Button(return_window, text="确认退货", command=on_return_selected).pack(pady=10)
def shopping_history(self):
messagebox.showinfo("提示", "消费记录功能尚未实现")
if __name__ == "__main__":
app = ShoppingCartSystem()
app.mainloop()