本文主要是介绍Python商城管理系统,连接SQLite3数据库,界面切换有商品条形图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
截图一:
功能:登录之前只有查看统计信息------商品库存管理条形图。
截图二:
功能:
登陆成功后,显示用户登录信息,比如用户昵称,欢迎提示语!
功能按钮都可用。【无操作,依旧显示条形图界面】
截图三:
功能:注册功能,重置测试可以,输入框全部清空
截图四:
功能:选中删除,和选中编辑信息,可以多选删除信息,编辑信息只能选择一个。
截图五:
功能:个人信息功能,可以修改信息(昵称,密码),不可修改账号
代码部分:
(本来是按照MVC三层写的,结果写着写着视图层和逻辑层就写到一起了!写到一半想改过来时,感觉写完再改也很简单,结果发现,改过来同样耗时耗力气,索性就这样吧。本来对三层架构不太清晰,越写越清晰,边写边看别人的代码,看被人主要看别人的逻辑思路,这个程序纯按照自己的思路写的,功能简单,简单的把模糊查询都省略了,其实写到最后越写越多,想写的实在是太多了,期末了,时间不允许,就这样吧!总结一下:写的时候方向就要写对,比如MVC严格按照这个路子写,不能偏,不然工作量很大。写完这个程序,感觉算是入门了吧!哈哈哈,边学边写,用了几个星期。刚开始面向对象都看不懂,很多代码觉得太难了,到最后,越写感觉越简单,写的越快!)
注意:变量名命不规范。这个以后也要注意!
view.py 这部分把逻辑和视图写一起了:
from tkinter import *
from tkinter import ttk
from sqliteCon import sql
from tkinter import messagebox
from showCanvas import ShowDraw
class View:def __init__(self):# 加载数据库对象self.sql=sql()# self.mod=Mod()self.showDraw=ShowDraw()# 显示主窗口self.windows()# 显示登录模块self.winUser()# 显示中间功能按钮模块self.winFunc()# 显示每个功能的窗口self.winMain()# 欢迎标签的动态数值绑定self.e1=StringVar()self.e2=StringVar()self.e3=StringVar()self.e4=StringVar()self.e5=StringVar()self.ee1=StringVar()self.ee2=StringVar()# 根据这个数字控制窗口的出现。销毁框架用self.showElemNum=0#登陆标记 默认未登录为false 登录为true# self.flag=Trueself.flag=False# 显示条形图# 显示条形图self.winCanvas()# self.showLuoji()def windows(self):# 视图 主窗口self.window = Tk() # 窗口实例化self.window.title('商城管理系统') #设置窗口名字self.window.geometry('800x600+500+300') #设置窗口大小 宽*高,并设置窗口位置self.window.resizable(0,0) #窗口大小不可更改def winUser(self):# 用户登录视图# 在框架里设置lable时,框架自身失去背景色,高为标签的高。# 框架里有内容,不用设置高,宽,自动撑起来self.frame_user=Frame(bg="#c7c7c7")# 账户密码框架# 账户密码框架置顶靠左显示 self.label_user=Label(self.frame_user,text="账号:",bg="#c7c7c7")self.entry_user=Entry(self.frame_user)self.label_pwd=Label(self.frame_user,text="密码:",bg="#c7c7c7")self.entry_pwd=Entry(self.frame_user,show='*')# 登录、注册按钮self.btn_login=Button(self.frame_user,text="登录",command=self.login)self.btn_logout=Button(self.frame_user,text="退出",command=self.logout)self.btn_register=Button(self.frame_user,text="注册",command=self.regiter)# 欢迎用户self.LWNText=StringVar()self.LWText=StringVar()self.label_wel_name=Label(self.frame_user,textvariable=self.LWNText,pady=15,bg="#c7c7c7")self.label_wel=Label(self.frame_user,textvariable=self.LWText,pady=15,bg="#c7c7c7")# 放置组件self.frame_user.pack(side=TOP,fill=X)self.label_user.pack(side=LEFT,padx=15,pady=15)self.entry_user.pack(side=LEFT)self.label_pwd.pack(side=LEFT,padx=15,pady=15)self.entry_pwd.pack(side=LEFT)self.btn_login.pack(side=LEFT,padx=24)self.btn_logout.pack(side=LEFT)self.btn_register.pack(side=LEFT,padx=24)self.label_wel_name.pack(side=RIGHT)self.label_wel.pack(side=RIGHT)def winFunc(self):# 主共能 中间菜单按钮self.frame_func=Frame()self.btn_query=Button(self.frame_func,text="查询商品",command=self.winQuery)self.btn_add=Button(self.frame_func,text="添加商品",command=self.winAdd)self.btn_showCanvas=Button(self.frame_func,text="数据统计",command=self.winCanvas)self.btn_personalInfo=Button(self.frame_func,text="个人信息",command=self.winPersnInfo) # 放置组件self.frame_func.pack()self.btn_query.pack(side=LEFT,pady=8,padx=32)self.btn_add.pack(side=LEFT,pady=8,padx=32)self.btn_showCanvas.pack(side=LEFT,pady=8,padx=32)self.btn_personalInfo.pack(side=LEFT,pady=8,padx=32)def winMain(self):# 显示内容frameself.frame_main=Frame(height=500,width=800,bg="#c7c7c7")# 放置组件self.frame_main.pack()def winCanvas(self):self.showLuoji()self.showElemNum=5self.frame_canvas=Frame(self.frame_main)self.frame_canvas.pack()self.showDraw.draw_bar(self.frame_canvas)def winPersnInfo(self):#个人信息管理 # 判断之前是否有窗口,有则销毁self.showLuoji()self.showElemNum=4self.infoLabel=Frame(self.frame_main)self.infoLabel.grid(padx=270,pady=80,ipadx=30,ipady=30)self.infoLabelName=Label(self.infoLabel,text="昵 称:")self.infoLabelName.grid(row=2,column=1,pady=20,sticky=E)self.infoEntryName=Entry(self.infoLabel,textvariable=self.ee1)self.infoEntryName.grid(row=2,column=2)self.infoLabelUser=Label(self.infoLabel,text="账 号:")self.infoLabelUser.grid(row=4,column=1,pady=20,sticky=E)self.infoEntryUser=Entry(self.infoLabel,textvariable=self.ee2)self.infoEntryUser.grid(row=4,column=2)self.infoLabelPwd=Label(self.infoLabel,text=" 原密码:")self.infoLabelPwd.grid(row=5,column=1,pady=20,sticky=E)self.infoEntryPwd=Entry(self.infoLabel,show="*")self.infoEntryPwd.grid(row=5,column=2)self.infoLabelPwd2=Label(self.infoLabel,text=" 新密码:")self.infoLabelPwd2.grid(row=8,column=1,pady=20,sticky=E)self.infoEntryPwd2=Entry(self.infoLabel)self.infoEntryPwd2.grid(row=8,column=2,sticky=W)self.infoSaveBtn=Button(self.infoLabel,text="更改",command=self.infoSave)self.infoSaveBtn.grid(row=10,column=1,columnspan=2,sticky=W,padx=50)self.infoczBtn=Button(self.infoLabel,text="重置",command=self.infoCZ)self.infoczBtn.grid(row=10,column=2,sticky=E,padx=30)self.infoShow()def infoCZ(self):self.infoEntryName.delete(0,END)self.infoEntryPwd.delete(0,END)self.infoEntryPwd2.delete(0,END)def infoShow(self):# 获取当前用户的账号,并填入文本输入框# usering是列表类型,存的是当前登录的用户信息users=self.sql.selectUser()for user in users:if user[1]==self.usering[1]:# 设置昵称self.ee1.set(user[3])# 设置账号self.ee2.set(user[1])# 设置账号输入框不可点击self.infoEntryUser.config(state=DISABLED)def infoSave(self):# 获取输入框的数据user_num=self.infoEntryUser.get()user_pwd1=self.infoEntryPwd2.get()user_pwd0=self.infoEntryPwd.get()user_name=self.infoEntryName.get()if user_num and user_pwd1 and user_pwd0 and user_name:if user_pwd0==self.usering[2]:if self.sql.updateUser(user_pwd=user_pwd1,user_name=user_name,user_num=user_num):messagebox.showinfo(message='已更改!请重新登录!')# 密码更改后直接退出当前用户self.logout()else:messagebox.showerror(message='更改失败!')else:messagebox.showerror(message='输入框不能为空!')def winQuery(self):# 信息查询self.showLuoji()self.showElemNum=2self.frameQuery=Frame(self.frame_main,bg="#c7c7c7")self.labTitle=Label(self.frameQuery,text='商品信息',bg="#c7c7c7")columns=('prod_id','prod_name','prod_price','prod_detail','prod_stock')self.dataListFrame=Frame(self.frameQuery)# show='headings' 隐藏首列self.dataList=ttk.Treeview(self.dataListFrame,height=15,show='headings',columns=columns)#滚动条 方向垂直 yview函数系统自带self.listVScroll=Scrollbar(self.dataListFrame,orient='vertical',command=self.dataList.yview)# 放在右边,进行Y轴填充self.listVScroll.pack(side=RIGHT,fill=Y)# 给treeview添加配置,将Scrollbar与 每行数据绑定。self.dataList.configure(yscrollcommand=self.listVScroll.set)self.dataList.column('prod_id',width=100,anchor='center')self.dataList.column('prod_name',width=100,anchor='center')self.dataList.column('prod_price',width=100,anchor='center')self.dataList.column('prod_detail',width=150,anchor='center')self.dataList.column('prod_stock',width=80,anchor='center')self.dataList.heading('prod_id',text='商品编号')self.dataList.heading('prod_name',text='商品名称')self.dataList.heading('prod_price',text='商品价格')self.dataList.heading('prod_detail',text='商品描述')self.dataList.heading('prod_stock',text='商品数量')self.frameQuery.pack(padx=130,pady=10)self.labTitle.pack()self.dataListFrame.pack()self.dataList.pack()self.delBtn=Button(self.frameQuery,text='删除所选信息',command=self.deleteBtn)self.delBtn.pack(pady=12,padx=120,side=LEFT)self.editBtn=Button(self.frameQuery,text='编辑所选信息',command=self.editSelectBtn)self.editBtn.pack(pady=12,side=LEFT)self.printItem()def printItem(self):# 逻辑代码 获取并显示数据库所有商品信息itemsData=self.sql.selectProd()i=0for item in itemsData:# 向treeview里插入所有数据self.dataList.insert('',i,values=item)i=i+1def deleteBtn(self):# 删除选中的数据# self.dataList.selection()获取选中的数据可以是单条记录,也可以是多条for item in self.dataList.selection():itemText=self.dataList.item(item,"values") # print(itemText[0])# 从数据库中删除选中的项self.sql.deleteProd(itemText[0])# 清空treeviewself.delTreeItems()# 重新显示数据库商品信息self.printItem()def delTreeItems(self):#清空treeview里的所有信息 # get_children()得到 treeview里得每一条数据,并删除x=self.dataList.get_children()for item in x:self.dataList.delete(item) def winAdd(self):self.showLuoji()self.showElemNum=3self.frameAdd=Frame(self.frame_main,bg="#c7c7c7") self.labelProdId=Label(self.frameAdd,text='商品编号:',bg="#c7c7c7") self.entryProdId=Entry(self.frameAdd,textvariable=self.e1)self.labelProdName=Label(self.frameAdd,text='商品名称:',bg="#c7c7c7") self.entryProdName=Entry(self.frameAdd,textvariable=self.e2)self.labelProdPrice=Label(self.frameAdd,text='商品价格:',bg="#c7c7c7") self.entryProdPrice=Entry(self.frameAdd,textvariable=self.e3)self.labelProdDetail=Label(self.frameAdd,text='商品描述:',bg="#c7c7c7") self.entryProdDetail=Entry(self.frameAdd,textvariable=self.e4)self.labelProdStock=Label(self.frameAdd,text='商品数量:',bg="#c7c7c7") self.entryProdStock=Entry(self.frameAdd,textvariable=self.e5)self.addBtn=Button(self.frameAdd,text='添加',command=self.add)self.delBtn=Button(self.frameAdd,text='修改',command=self.update2)self.frameAdd.grid(ipady=60,padx=300,pady=100)self.labelProdId.grid(row=0,column=1,pady=20)self.entryProdId.grid(row=0,column=2)self.labelProdName.grid(row=1,column=1)self.entryProdName.grid(row=1,column=2)self.labelProdPrice.grid(row=2,column=1,pady=20)self.entryProdPrice.grid(row=2,column=2)self.labelProdDetail.grid(row=3,column=1)self.entryProdDetail.grid(row=3,column=2)self.labelProdStock.grid(row=4,column=1,pady=20)self.entryProdStock.grid(row=4,column=2)self.addBtn.grid(row=5,column=1,columnspan=2,sticky=W,padx=50)self.delBtn.grid(row=5,column=2,sticky=E,padx=30)def editSelectBtn(self):# 编辑模块for item in self.dataList.selection():itemText=self.dataList.item(item,"values") # print(itemText[0])# 从数据库中删除选中的项self.e1.set(itemText[0])self.e2.set(itemText[1])self.e3.set(itemText[2])self.e4.set(itemText[3])self.e5.set(itemText[4])self.frameQuery.destroy()self.winAdd()self.entryProdId.config(state=DISABLED)def update2(self): # 这是添加商品中的修改按钮prod_id=self.entryProdId.get()prod_name=self.entryProdName.get()prod_price=self.entryProdPrice.get()prod_detail=self.entryProdDetail.get()prod_stock=self.entryProdStock.get()if prod_id!='' and prod_name!='' and prod_price!='' and prod_detail!='' and prod_stock!='':if self.sql.updateProd(prod_name=prod_name,prod_price=prod_price,prod_detail=prod_detail,prod_stock=prod_stock,prod_id=prod_id):messagebox.showinfo(message='修改成功!')else:messagebox.showerror(message='修改失败!')# 商品编号输入框变为正常(可更改)self.entryProdId.config(state=NORMAL) # 清空文本输入框内容self.entryProdId.delete(0,len(prod_id))self.entryProdName.delete(0,len(prod_name))self.entryProdPrice.delete(0,len(prod_price))self.entryProdDetail.delete(0,len(prod_detail))self.entryProdStock.delete(0,len(prod_stock)) else:messagebox.showerror(message='输入框不能为空!')# 添加商品信息def add(self):prod_id=self.entryProdId.get()prod_name=self.entryProdName.get()prod_price=self.entryProdPrice.get()prod_detail=self.entryProdDetail.get()prod_stock=self.entryProdStock.get()# 判断是否输入数据if prod_id!='' and prod_name!='' and prod_price!='' and prod_detail!='' and prod_stock!='':if self.sql.insertProd(prod_id=prod_id,prod_name=prod_name,prod_price=prod_price,prod_detail=prod_detail,prod_stock=prod_stock):messagebox.showinfo(message='添加成功!')else:messagebox.showerror(message='添加失败!')self.entryProdId.delete(0,len(prod_id))self.entryProdName.delete(0,len(prod_name))self.entryProdPrice.delete(0,len(prod_price))self.entryProdDetail.delete(0,len(prod_detail))self.entryProdStock.delete(0,len(prod_stock)) else:messagebox.showerror(message='输入框不能为空!')def login(self):# 登录功能users=self.sql.selectUser()user=self.entry_user.get()pwd=self.entry_pwd.get()if len(users) > 0:for row in users:if user==row[1] and pwd==row[2]:self.LWNText.set(row[3])self.LWText.set('欢迎你!')# 显示条形图self.winCanvas()# 保存当前用户名self.usering=row# print(row[1])self.flag=True# 文本输入框不可更改self.entry_user.config(state=DISABLED)self.entry_pwd.config(state=DISABLED)self.showLuoji()messagebox.showinfo(message='登陆成功!')breakif not self.flag:messagebox.showerror(message='账户或密码错误!')else:messagebox.showwarning(message='无法登录!')# 显示条形图self.winCanvas() def logout(self):# 退出功能self.flag=Falseself.showLuoji()self.LWNText.set('')self.LWText.set('你还未登录!')# 设置可编辑self.entry_user.config(state=NORMAL)self.entry_pwd.config(state=NORMAL)# 清空文本框内容self.entry_user.delete(0,END)self.entry_pwd.delete(0,END)# 显示条形图self.winCanvas()def regiter(self):# 注册功能self.showLuoji()self.showElemNum=1# 注册按钮点一下是我们想要的效果,第二下直接覆盖界面,无法解决self.regLebel=LabelFrame(self.frame_main)self.regLebel.pack(pady=69,padx=238,ipadx=40,ipady=38)self.regLabelUser=Label(self.regLebel,text="昵 称:")self.regLabelUser.grid(row=2,column=0,pady=20,sticky=E)self.regEntryUser=Entry(self.regLebel)self.regEntryUser.grid(row=2,column=1,columnspan=2,pady=20,sticky=W)self.regLabelName=Label(self.regLebel,text="账 号:")self.regLabelName.grid(row=4,column=0,pady=20,sticky=E)self.regEntryName=Entry(self.regLebel)self.regEntryName.grid(row=4,column=1,pady=20,columnspan=2,sticky=W)self.regLabelPwd=Label(self.regLebel,text="密 码:")self.regLabelPwd.grid(row=5,column=0,pady=20,sticky=E)self.regEntryPwd=Entry(self.regLebel,show="*")self.regEntryPwd.grid(row=5,column=1,pady=20,columnspan=2,sticky=W)self.regLabelPwd2=Label(self.regLebel,text="确认密码:")self.regLabelPwd2.grid(row=8,column=0,pady=20,sticky=E)self.regEntryPwd2=Entry(self.regLebel,show="*")self.regEntryPwd2.grid(row=8,column=1,columnspan=2,pady=20,sticky=W)
#
# 始终对不齐,这个标签是多余的,删除注册界面会对不齐,问题可能是Labelframe得问题,另一个地方用的frame,用同样的方法对齐了Label(self.regLebel,text=" ").grid(row=10,column=0,padx=40)
# self.czBtn=Button(self.regLebel,text="重置",command=self.regCZBtn)self.czBtn.grid(row=10,column=1,sticky=W)self.regitBtn=Button(self.regLebel,text="注册",command=self.regBtn)self.regitBtn.grid(row=10,column=2,sticky=W)def regCZBtn(self):# 重置功能self.regEntryUser.delete(0,END)self.regEntryName.delete(0,END)self.regEntryPwd.delete(0,END)self.regEntryPwd2.delete(0,END)def regBtn(self):# 获取输入值username=self.regEntryUser.get()usernum=self.regEntryName.get()userpwd=self.regEntryPwd.get()userpwd2=self.regEntryPwd2.get()# 判断输入内容if username!=""and usernum!="" and userpwd!="" and userpwd2!="":if userpwd==userpwd2:if self.sql.register(usernum=usernum,userpwd=userpwd,username=username):messagebox.showinfo(message="注册成功!")else:messagebox.showerror(message="注册失败!")else:messagebox.showerror(message="密码输入不一致!")else:messagebox.showinfo(message="请填入完整信息!") def showLuoji(self):if not self.flag:self.btn_query.config(state=DISABLED)self.btn_add.config(state=DISABLED)self.btn_personalInfo.config(state=DISABLED)self.btn_logout.config(state=DISABLED)else:self.btn_add.config(state=NORMAL)self.btn_query.config(state=NORMAL)self.btn_personalInfo.config(state=NORMAL)self.btn_logout.config(state=NORMAL)if self.showElemNum==1:self.regLebel.destroy()elif self.showElemNum==2:self.frameQuery.destroy()elif self.showElemNum==3:self.frameAdd.destroy()elif self.showElemNum==4:self.infoLabel.destroy()elif self.showElemNum==5:self.frame_canvas.destroy() if not self.flag: self.LWNText.set('')self.LWText.set('请登录账户!') # __name__:模块的名字
# 当脚本运行时内置变量__name__的值为__main__
# 课本p216页 模块的主要属性
if __name__ == "__main__":view=View()view.window.mainloop()# 进入消息循环
showCanvas.py 画条形图
import tkinter as tk
import matplotlib
import matplotlib.pyplot as plt
# 创建画布需要的库
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# 导入画图常用的库
from matplotlib.figure import Figure
from sqliteCon import sql
class ShowDraw:def __init__(self):self.sql=sql()# self.main()def draw_bar(self,frame):# 存放商品数量self.itemLabels = []# 存放商品名self.itemXTexts=[]items=self.sql.selectProd()for item in items:if item[4]<=70:self.itemLabels.append(item[4])self.itemXTexts.append(item[1])# --------------------------------# 创建图像 画布大小 单位英寸 分辨率100f=plt.figure(figsize=(8,4),dpi=100)canvas=FigureCanvasTkAgg(f,master=frame)canvas.get_tk_widget().grid()# 直接输出整块画布,不分成小块 1*1 1a=f.add_subplot(111)# 解决汉字乱码问题plt.rcParams['font.sans-serif'] = ['SimHei']# 使用指定的汉字字体类型(此处为黑体)a.clear()# 绘条形图plt.bar(range(len(self.itemLabels)),self.itemLabels,align='center',color='blue')plt.title('商品库存条形图')# 设置x轴坐标plt.xticks(range(len(self.itemXTexts)),self.itemXTexts)# y轴的值plt.ylim([0,200])# 为每个条形图添加数值标签for x,y in enumerate(self.itemLabels):plt.text(x,y+20,'%s'%round(y,1),ha='center')canvas.draw()if __name__=="__main__":s=ShowDraw()
sqliteCon.py 数据库连接
import sqlite3class sql:def __init__(self):# 连接数据库self.conn=sqlite3.connect('test.db')#创建游标self.cursor=self.conn.cursor()# 按账号修改用户用到的SQL语句self.SQLUpdateUser="update user set user_pwd=?,user_name=? where user_num=?" # 注册 插入SQL语句# self.SQLregister="insert into user(user_num,user_pwd,user_name) values(?,?,?);"self.SQLInsertUser="insert into user(user_num,user_pwd,user_name)values(?,?,?)"# 查询用户self.SQLSelectUser="select * from user"# 查询商品信息self.SQLSelectProd="select * from product"#插入产品信息 \是连接作用self.SQLInsertProd="insert into product(prod_id,prod_name,prod_price,prod_detail,prod_stock)\values(?,?,?,?,?)"# 修改商品信息 更新self.SQLUpdateProd="update product set prod_name=?,prod_price=?,\prod_detail=?,prod_stock=? where prod_id=?" # 按 商品编号 删除 商品 self.SQLDelectProd="delete from product where prod_id=?"# 模糊查询 # self.SQLSearch="select * from product where prod_id like ? or prod_name like ? or prod_price like ? or prod_detail like ? or prod_stock like ?"def __del__(self):# 释放对象,执行方法# 关闭游标self.cursor.close() #关闭连接self.conn.close()def register(self,**userss):# 注册用户try:# print(userss)# 可变参数:p109# **表示放在字典里的参数,*元组# param 是列表,userss['usernum']获取字典里的值,并放入列表 用于下一句的参数param=[userss['usernum'],userss['userpwd'],userss['username']]self.cursor.execute(self.SQLInsertUser,param)# 没有提交方法,数据不更改!self.conn.commit()return Trueexcept sqlite3.Error:return False def updateUser(self,**kwargs):# 修改更新用户信息try:param=[kwargs['user_pwd'],kwargs['user_name'],kwargs['user_num']] self.cursor.execute(self.SQLUpdateUser,param)self.conn.commit()return Trueexcept sqlite3.Error:return Falsedef selectUser(self):# 查询用户self.cursor.execute(self.SQLSelectUser)# 返回一个二维数组,记录所有符合条件的记录,若无数据返回noneresult=self.cursor.fetchall()return resultdef selectProd(self):# 查询商品信息self.cursor.execute(self.SQLSelectProd)result=self.cursor.fetchall()return resultdef insertProd(self,**kwargs):# 添加商品try:param=[kwargs['prod_id'],kwargs['prod_name'],kwargs['prod_price'],kwargs['prod_detail'],kwargs['prod_stock']] self.cursor.execute(self.SQLInsertProd,param)self.conn.commit()return Trueexcept sqlite3.Error:return Falsedef deleteProd(self,prod_id):# 按商品编号删除信息try:self.cursor.execute(self.SQLDelectProd,[prod_id])self.conn.commit()# 记录有效行数effectRow=self.cursor.rowcountif effectRow>0:return Trueelse:return Falseexcept sqlite3.Error:return False def updateProd(self,**kwargs):# 按商品编号更新信息try:param=[kwargs['prod_name'],kwargs['prod_price'],kwargs['prod_detail'],kwargs['prod_stock'],kwargs['prod_id']] self.cursor.execute(self.SQLUpdateProd,param)self.conn.commit()return Trueexcept sqlite3.Error:return False# 模糊查询# def searchProd(self, key):# try:# # 列表生成器# param = ['%' + str(key) + '%' for i in range(5)]# self.cursor.execute(self.SQLSearch, param)# result = self.cursor.fetchall()# return result# except sqlite3.Error:# return None
这篇关于Python商城管理系统,连接SQLite3数据库,界面切换有商品条形图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!