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
X|Hqo#{p+T7m4FEn^159a>@S-7=G
literal 0
HcmV?d00001
diff --git a/__pycache__/login.cpython-311.pyc b/__pycache__/login.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..204cc43e47d3c8d1aa9549cea3d81daa838b9238
GIT binary patch
literal 6695
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
A$^ZZW
literal 0
HcmV?d00001
diff --git a/commodity.py b/commodity.py
new file mode 100644
index 0000000..6614a35
--- /dev/null
+++ b/commodity.py
@@ -0,0 +1,16 @@
+#商品实体类
+class commodity:
+ def __init__(self, com_code, com_name, com_price, com_stock):
+ self.com_code = com_code #编号
+ self.com_name = com_name #名称
+ self.com_price = com_price #价格
+ self.com_stock = com_stock #库存
+
+ def get_commodity(self):
+ com_dict = {
+ 'com_code':self.com_code,
+ 'com_name':self.com_name,
+ 'com_price':self.com_price,
+ 'com_stock':self.com_stock,
+ }
+ return com_dict
\ No newline at end of file
diff --git a/index.py b/index.py
new file mode 100644
index 0000000..3508b55
--- /dev/null
+++ b/index.py
@@ -0,0 +1,464 @@
+from tkinter import *
+import tkinter as tk
+
+import numpy as np
+import openpyxl #操作excel表格
+import pymssql #链接数据库
+import tkinter.font as tkFont#字体
+from tkinter import ttk #界面样式
+from tkinter.filedialog import askopenfilename,askdirectory#系统文件操作
+from tkinter import messagebox#信息提示框
+from pandas import DataFrame#写数据表
+from commodity import commodity # 商品实体类
+import matplotlib.pyplot as plt #数据图包
+from PIL import Image, ImageTk
+# 创建主页面UI
+
+
+class Application(Frame):
+ # 初始化
+ def __init__(self, master=None):
+ super().__init__(master)
+ self.master = master
+ self.pack()
+ self.createWidget()
+ # 连接数据库
+ server = "LAPTOP-7PS55P1C"
+ user = "sa"
+ pwd = "123456"
+ db = "fruit"
+ self.conn = pymssql.connect(server, user, pwd, db, tds_version="7.0")
+ self.cursor = self.conn.cursor()
+ # 创建主页元素
+ def createWidget(self):
+ # 左侧背景图片
+ global photo_bg
+ photo_bg=PhotoImage(file='./s/center.gif')
+ lable_bg=Label(self,image=photo_bg)
+ lable_bg.pack()
+ self.frame_left = Frame(self,bg='#68b8be',width=200,height=540).place(x=0, y=0)
+# logo图
+ global photo_Avatar
+ photo_Avatar=PhotoImage(file='./s/4.gif')
+ lable_Avatar=Label(self.frame_left,bg='#68b8be',image=photo_Avatar)
+ lable_Avatar.place(x=23,y=25)
+# 功能按钮
+ menu_font=tkFont.Font(family='宋体',size=10)
+ Button(self.frame_left,text='数据图信息',font=menu_font,fg='#000000',bg='#ffffff',command=self.index_drawing,).place(x=30,y=143,width=140,height=30)
+ Button(self.frame_left,text='商品信息',font=menu_font,fg='#000000',bg='#ffffff',command=self.index_info,).place(x=30,y=193,width=140,height=30)
+ Button(self.frame_left,text='查询商品',font=menu_font,fg='#000000',bg='#ffffff',command=self.index_inquire,).place(x=30,y=243,width=140,height=30)
+ Button(self.frame_left,text='添加商品',font=menu_font,fg='#000000',bg='#ffffff',command=self.index_add,).place(x=30,y=293,width=140,height=30)
+ Button(self.frame_left,text='修改商品',font=menu_font,fg='#000000',bg='#ffffff',command=self.index_modify,).place(x=30,y=343,width=140,height=30)
+ Button(self.frame_left,text='删除商品',font=menu_font,fg='#000000',bg='#ffffff',command=self.index_delete,).place(x=30,y=393,width=140,height=30)
+ Button(self.frame_left,text='关于',font=menu_font,fg='#000000',bg='#ffffff',command=self.index_about,).place(x=30,y=443,width=140,height=30)
+ Button(self.frame_left,text='退出',font=menu_font,fg='#000000',bg='#ffffff',command=self.index_quit,).place(x=30,y=493,width=140,height=30)
+# 右侧背景图
+ self.frame_right=Frame(self,width=600,height=540).place(x=200,y=0)
+ global photo_index
+ photo_index=PhotoImage(file='./s/center.gif')
+ Label(self.frame_right,image=photo_index).place(x=200,y=0)
+# 图纸
+ def index_drawing(self):
+ plt.rcParams["font.sans-serif"] = ["SimHei"]
+ y_pos = np.arange(len(self.DataList(1)))
+ # 创建条形图
+ plt.bar(y_pos, self.DataList(0))
+ # x轴标签
+ x = [1, 2, 3, 4, 5]
+ plt.xticks(y_pos, self.DataList(1))
+ # 显示
+ plt.show()
+ def DataList(self, number):
+ sql = "select top 5 com_stock,com_name from commodity order by cast(com_stock as int) desc"
+ self.cursor.execute(sql)
+ results = self.cursor.fetchall()
+ print(results)
+ data = []
+ for i in results:
+ data.append(str(i[number]).strip())
+ data = data[::-1]
+ # 将 'col_name' 列转换为数组
+ print(data)
+ return data
+
+# 01查看商品信息
+ def index_info(self):
+ info=tk.Toplevel()
+ w=600
+ h=400
+ x=(info.winfo_screenwidth()-w)/2
+ y=(info.winfo_screenheight()-h)/2
+ info.geometry('%dx%d+%d+%d'%(w,h,x,y))
+ info.title('商品信息')
+ info.resizable(width=False,height=False)
+ info_frame=Frame(info,bg='#68b8be',width=600,height=55)
+ info_frame.place(x=0,y=0)
+ inquire_font_1=tkFont.Font(family='宋体',size=25,weight=tkFont.BOLD)
+ Label(info_frame,text='商品信息',font=inquire_font_1,bg='#68b8be').place(x=230,y=10)
+ entries=[]
+ sql="select *from commodity"
+ self.cursor.execute(sql)
+ results=self.cursor.fetchall()
+ com_list=[]
+ for result in results:
+ com_li=commodity(result[0],result[1],result[2],result[3])
+ com_list.append(com_li)
+ for i in com_list:
+ args=(i.get_commodity()['com_code'],i.get_commodity()['com_name'],i.get_commodity()['com_code'],i.get_commodity()['com_stock'])
+ entries.append(args)
+ table_frame=Frame(info)
+ table_frame.place(x=0,y=55,width=600,height=345)
+ yscroll=Scrollbar(table_frame,orient=VERTICAL)
+ style=ttk.Style()
+ style.configure('Treeview.Heading',font=(None,14))
+ style.configure('Treeview',rowheight=30,font=(None,12))
+ tree=ttk.Treeview(
+ master=table_frame,
+ columns=('商品编号','商品名称','商品价格','商品库存'),
+ yscrollcommand=yscroll.set,
+ )
+ yscroll.config(command=tree.yview)
+ yscroll.pack(side=RIGHT,fill=Y)
+ tree['show']='headings'
+ tree.heading('#1',text='商品编号')
+ tree.heading('#2',text='商品名称')
+ tree.heading('#3',text='商品价格')
+ tree.heading('#4',text='商品库存')
+ tree.column('#1',stretch=YES,width=150,minwidth=150,anchor='center')
+ tree.column('#2',stretch=YES,width=150,minwidth=150,anchor='center')
+ tree.column('#3',stretch=YES,width=150,minwidth=150,anchor='center')
+ tree.column('#4',stretch=YES,width=150,minwidth=150,anchor='center')
+ tree.pack(fill=BOTH,expand=1)
+ for entry in entries:
+ tree.insert('','end',values=(entry[0],entry[1],entry[2],entry[3]))
+ info.mainloop()
+# 查询商品
+#02查询商品
+ def index_inquire(self):
+ inquire=tk.Toplevel()
+ w=600
+ h=400
+ x=(inquire.winfo_screenwidth()-w)/2
+ y=(inquire.winfo_screenheight()-h)/2
+ global com_code
+ global com_price
+ global com_stock
+ global com_name_label
+ global com_price_label
+ global com_stock_label
+ com_code='查询中'
+ com_price='查询中'
+ com_stock='查询中'
+ inquire.geometry('%dx%d+%d+%d'%(w,h,x,y))
+ inquire.title('查询商品')
+ inquire.resizable(width=False,height=False)
+ inquire_frame=Frame(inquire,bg='#68b8be',width=600,height=400)
+ inquire_frame.pack()
+ inquire_font_1=tkFont.Font(family='宋体',size=25,weight=tkFont.BOLD)
+ Label(inquire_frame,text='查询商品信息',font=inquire_font_1,bg='#68b8be').place(x=200,y=20)
+ inquire_font_2=tkFont.Font(family='宋体',size=15)
+
+ # 说明图片位置,并导入图片到画布上
+ Label(inquire_frame, text='商品编号', font=inquire_font_2, bg='#68b8be').place(x=200, y=90)
+ Label(inquire_frame, text='商品名称', font=inquire_font_2, bg='#68b8be').place(x=200, y=150)
+ Label(inquire_frame, text='商品价格', font=inquire_font_2, bg='#68b8be').place(x=200, y=210)
+ Label(inquire_frame, text='商品库存', font=inquire_font_2, bg='#68b8be').place(x=200, y=270)
+ com_name_label=Label(inquire_frame,text=com_code,font=inquire_font_2,bg='#68b8be')
+ com_name_label.place(x=300,y=90)
+ com_name = tk.StringVar()
+ Entry(inquire_frame,highlightthickness=1,font=('宋体',15),bg='#F3F3F4',textvariable=com_name).place(x=300,y=150,width=200,height=30)
+ com_price_label = Label(inquire_frame, text=com_price, font=inquire_font_2, bg='#68b8be')
+ com_price_label.place(x=300, y=210)
+ com_stock_label = Label(inquire_frame, text=com_stock, font=inquire_font_2, bg='#68b8be')
+ com_stock_label.place(x=300, y=270)
+ Button(inquire_frame,text='立即查询',font=('宋体',15,'bold'),fg="#000000",bg="#ffffff",
+ command=lambda: self.inquire_com(com_name)).place(x=180,y=325,width=240,height=40)
+ inquire.mainloop()
+#02-1数据库中查询商品,返回结果
+ def inquire_com(self,com_name):
+ sql="select *from commodity where com_name like '%"+str(com_name.get())+"%'"
+ self.cursor.execute(sql)
+ result=self.cursor.fetchall()
+ self.conn.commit()
+ print(sql)
+ if len(result) ==0:
+ com_name_label.config(text='未查询到商品')
+ com_price_label.config(text='未查询到商品')
+ com_stock_label.config(text='未查询到商品')
+ else:
+ com=commodity(result[0][0],result[0][1],result[0][2],result[0][3])
+ if com is False:
+ com_name_label.config(text='未查询到商品')
+ com_price_label.config(text='未查询到商品')
+ com_stock_label.config(text='未查询到商品')
+ else:
+ com_name_label.config(text=com.get_commodity()['com_code'])
+ com_price_label.config(text=com.get_commodity()['com_price'])
+ com_stock_label.config(text=com.get_commodity()['com_stock'])
+#03添加商品界面
+ def index_add(self):
+ add=tk.Toplevel()
+ w = 600
+ h = 400
+ x = (add.winfo_screenwidth() - w) / 2
+ y = (add.winfo_screenheight()-h) / 2
+ self.com_code=tk.StringVar()
+ self.com_name=tk.StringVar()
+ self.com_price=tk.StringVar()
+ self.com_stock=tk.StringVar()
+ add.geometry('%dx%d+%d+%d' % (w, h, x, y))
+ add.title('修改商品')
+ add.resizable(width=False, height=False)
+ add_frame = Frame(add, bg='#68b8be', width=600, height=400)
+ add_frame.pack()
+ add_font_1 = tkFont.Font(family='宋体', size=25, weight=tkFont.BOLD)
+ Label(add_frame, text='添加商品信息', font=add_font_1, bg='#68b8be').place(x=200, y=20)
+ add_font_2 = tkFont.Font(family='宋体', size=15)
+ # Label(add_frame, text='商品编号', font=add_font_2, bg='#68b8be').place(x=100, y=90)
+ modify_font_3=tkFont.Font(family='宋体',size=9)
+ # Label(add_frame, text='注意:商品编号不可重复', font=modify_font_3, bg='#68b8be').place(x=235, y=125)
+ Label(add_frame, text='商品名称', font=add_font_2, bg='#68b8be').place(x=100, y=100)
+ Label(add_frame, text='商品价格', font=add_font_2, bg='#68b8be').place(x=100, y=160)
+ Label(add_frame, text='商品库存', font=add_font_2, bg='#68b8be').place(x=100, y=210)
+ # Entry(add_frame, highlightthickness=1, font=('宋体', 15), bg='#F3F3F4', textvariable=self.com_code).place(x=300,y=90,width=200,height=30)
+ Entry(add_frame, highlightthickness=1, font=('宋体', 15), bg='#F3F3F4', textvariable=self.com_name).place(x=300,y=100,width=200,height=30)
+ Entry(add_frame, highlightthickness=1, font=('宋体', 15), bg='#F3F3F4', textvariable=self.com_price).place(x=300,y=160,width=200,height=30)
+ Entry(add_frame, highlightthickness=1, font=('宋体', 15), bg='#F3F3F4', textvariable=self.com_stock).place(x=300,y=210,width=200,height=30)
+ Button(add_frame,text='批量添加',font=('宋体',15,'bold'),fg='#000000',bg='#ffffff',command=self.add_com_up).place(x=50,y=325,width=120,height=40)
+ Button(add_frame,text='立即添加',font=('宋体',15,'bold'),fg='#000000',bg='#ffffff',command=self.add_com).place(x=250,y=325,width=120,height=40)
+ Button(add_frame,text='下载模板',font=('宋体',15,'bold'),fg='#000000',bg='#ffffff',command=self.add_com_download).place(x=450,y=325,width=120,height=40)
+ add.mainloop()
+#03-1数据库中添加商品(上传文件方式)
+ def add_com_up(self):
+ path=askopenfilename(title='上传文件',initialdir='D:',filetypes=[("Excel表格",".xlsx")])
+ file=openpyxl.load_workbook(path)
+ ws=file[file.sheetnames[0]]#第一个表
+ excel_max_row=ws.max_row#最大行
+ list_com=[]
+ for row in range(2,excel_max_row+1):
+ com_code=ws.cell(row,1).value,
+ com_name=ws.cell(row,2).value,
+ com_price=ws.cell(row,3).value,
+ com_stock=ws.cell(row,4).value,
+ com=commodity(com_code,com_name,com_price,com_stock)
+ com_dict=com.get_commodity()
+ list_com.append(com_dict)
+ results=[]
+ for com in list_com:
+ com_code=com['com_code'][0]
+ com_name=com['com_name'][0]
+ com_price=com['com_price'][0]
+ com_stock=com['com_stock'][0]
+ sql="insert into commodity(com_name,com_price,com_stock) values('%s','%s','%s')" %(com_name,com_price,com_stock)
+ self.cursor.execute(sql)
+ # result=self.cursor.fetchall()
+ self.conn.commit()
+ results.append(com)
+ if len(results)==excel_max_row-1:
+ messagebox.showinfo('提示','商品批量导入成功!')
+ elif len(results)!=0 and len(results)!=excel_max_row-1:
+ messagebox.showinfo('提示','导入成功%s条商品数据,共%s条商品数据!'%(len(results),excel_max_row-1))
+ else:
+ messagebox.showinfo('提示','商品批量导入失败')
+#03-2数据库中添加商品(直接输入的方式)
+ def add_com(self):
+ sql = "insert into commodity(com_name,com_price,com_stock) values('%s','%s','%s')" %(
+ self.com_name.get(),self.com_price.get(),self.com_stock.get())
+ try:
+ print(sql)
+ self.cursor.execute(sql)
+ self.conn.commit()
+ messagebox.showinfo('提示','添加商品成功')
+ except:
+ messagebox.showinfo('提示','添加商品失败')
+#03-3数据库中添加商品(下载模板)
+ def add_com_download(self):
+ path=askdirectory(title='下载到')
+ com=commodity('使用前请删除本行', 'tip:商品编号不允许重复', '保留两位小数', '整数')
+ dict_com=com.get_commodity()
+ list_com=[dict_com]
+ print(list_com)
+ com_code=[]
+ com_name=[]
+ com_price=[]
+ com_stock=[]
+ for li_com in list_com:
+ com_code.append(li_com['com_code'])
+ com_name.append(li_com['com_name'])
+ com_price.append(li_com['com_price'])
+ com_stock.append(li_com['com_stock'])
+ testDate=[com_code,com_name,com_price,com_stock]
+ name="/商品批量导入模板.xlsx"
+ filepath=path+name
+ dfData = {
+ "商品编号":testDate[0],
+ "商品名称":testDate[1],
+ "商品价格":testDate[2],
+ "商品库存":testDate[3],
+ }
+ print(dfData)
+ df= DataFrame(dfData)#创建DataFrame
+ df.to_excel(filepath,index=False)
+ if len(df) !=0:
+ messagebox.showinfo('提示','模板下载成功')
+ else:
+ messagebox.showinfo('提示','模板下载失败')
+#04修改商品界面
+ def index_modify(self):
+ modify = tk.Toplevel()
+ w = 600
+ h = 400
+ x = (modify.winfo_screenwidth() - w) / 2
+ y = (modify.winfo_screenheight()-h) / 2
+ global com_code
+ global com_name
+ global com_price
+ global com_stock
+ global com_name_label
+ global com_price_label
+ global com_stock_label
+ com_code=tk.StringVar()
+ com_name = tk.StringVar()
+ com_price = tk.StringVar()
+ com_stock = tk.StringVar()
+ modify.geometry('%dx%d+%d+%d' % (w, h, x, y))
+ modify.title('修改商品')
+ modify.resizable(width=False, height=False)
+ modify_frame = Frame(modify, bg='#68b8be', width=600, height=400)
+ modify_frame.pack()
+ modify_font_1 = tkFont.Font(family='宋体', size=25, weight=tkFont.BOLD)
+ Label(modify_frame, text='修改商品信息', font=modify_font_1, bg='#68b8be').place(x=200, y=30)
+ modify_font_2 = tkFont.Font(family='宋体', size=15)
+ modify_font_3 = tkFont.Font(family='宋体', size=9)
+ Label(modify_frame, text='商品编号', font=modify_font_2, bg='#68b8be').place(x=100, y=90)
+ ##################################################
+ Label(modify_frame, text='注意:商品编号不可修改', font=modify_font_3, bg='#68b8be').place(x=100, y=110)
+ Label(modify_frame, text='商品名称', font=modify_font_2, bg='#68b8be').place(x=100, y=150)
+ Label(modify_frame, text='商品价格', font=modify_font_2, bg='#68b8be').place(x=100, y=210)
+ Label(modify_frame, text='商品库存', font=modify_font_2, bg='#68b8be').place(x=100, y=270)
+ #输入框
+ Entry(modify_frame, highlightthickness=1, font=('宋体', 15), bg='#F3F3F4', textvariable=com_code).place(x=300,y=90,width=200,height=30)
+ Entry(modify_frame, highlightthickness=1, font=('宋体', 15), bg='#F3F3F4', textvariable=com_name).place(x=300,y=150,width=200,height=30)
+ Entry(modify_frame, highlightthickness=1, font=('宋体', 15), bg='#F3F3F4', textvariable=com_price).place(x=300,y=210,width=200,height=30)
+ Entry(modify_frame, highlightthickness=1, font=('宋体', 15), bg='#F3F3F4', textvariable=com_stock).place(x=300,y=270,width=200,height=30)
+ #按钮
+ Button(modify_frame, text='立即查询', font=('宋体', 15, 'bold'), fg="#000000", bg="#ffffff",
+ command=self.modify_inquire_com).place(x=100, y=325, width=120, height=40)
+ Button(modify_frame, text='立即修改', font=('宋体', 15, 'bold'), fg="#000000", bg="#ffffff",
+ command=self.modify_com).place(x=340, y=325, width=120, height=40)
+ modify.mainloop()
+#04-1立即查询商品
+ def modify_inquire_com(self):
+ sql='select *from commodity where com_code=%s'% com_code.get()
+ self.cursor.execute(sql)
+ result=self.cursor.fetchall()
+ self.conn.commit()
+ if len(result) ==0:
+ com_name.set('未找到相关商品')
+ com_price.set('未找到相关商品')
+ com_stock.set('未找到相关商品')
+ else:
+ com=commodity(result[0][0],result[0][1],result[0][2],result[0][3],)
+ com_name.set(com.get_commodity()['com_name'])
+ com_price.set(com.get_commodity()['com_price'])
+ com_stock.set(com.get_commodity()['com_stock'])
+#04-2修改商品
+ def modify_com(self):
+ ###############################################
+ sql="update commodity set com_name='%s',com_price='%s',com_stock='%s' where com_code=%s" %(
+ com_name.get().strip(),com_price.get().strip(),com_stock.get().strip(),com_code.get().strip())
+ self.cursor.execute(sql)
+ self.conn.commit()
+ messagebox.showinfo('提示','修改成功')
+#05删除商品界面
+ def index_delete(self):
+ delete=tk.Toplevel()
+ w = 600
+ h = 400
+ x = (delete.winfo_screenwidth() - w) / 2
+ y = (delete.winfo_screenheight() - h) / 2
+ global com_name
+ global com_price
+ global com_stock
+ global com_name_label
+ global com_price_label
+ global com_stock_label
+ com_name = '查询中'
+ com_price = '查询中'
+ com_stock = '查询中'
+ delete.geometry('%dx%d+%d+%d' %(w,h,x,y))
+ delete.title('删除商品')
+ delete.resizable(width=False,height=False)
+ delete_frame = Frame(delete, bg='#68b8be', width=600, height=400)
+ delete_frame.pack()
+ delete_font_1 = tkFont.Font(family='宋体', size=25, weight=tkFont.BOLD)
+ ###############################
+ Label(delete_frame, text='删除商品信息', font=delete_font_1, bg='#68b8be').place(x=200, y=30)
+ delete_font_2 = tkFont.Font(family='宋体', size=15)
+ ###############################
+ Label(delete_frame, text='商品编号', font=delete_font_2, bg='#68b8be').place(x=200, y=90)
+ Label(delete_frame, text='商品名称', font=delete_font_2, bg='#68b8be').place(x=200, y=150)
+ Label(delete_frame, text='商品价格', font=delete_font_2, bg='#68b8be').place(x=200, y=210)
+ Label(delete_frame, text='商品库存', font=delete_font_2, bg='#68b8be').place(x=200, y=270)
+ delete_com_code = tk.StringVar()
+ Entry(delete_frame, highlightthickness=1, font=('宋体', 15), bg='#F3F3F4', textvariable=delete_com_code).place(x=300,y=90,width=200,height=30)
+ com_name_label = Label(delete_frame, text=com_name, font=delete_font_2, bg='#68b8be')
+ com_name_label.place(x=300, y=150)
+ com_price_label = Label(delete_frame, text=com_price, font=delete_font_2, bg='#68b8be')
+ com_price_label.place(x=300, y=210)
+ com_stock_label = Label(delete_frame, text=com_stock, font=delete_font_2, bg='#68b8be')
+ com_stock_label.place(x=300, y=270)
+ Button(delete_frame, text='立即查询', font=('宋体', 15, 'bold'), fg="#000000", bg="#ffffff",
+ command=lambda: self.delete_inquire_com(delete_com_code)).place(x=100, y=325, width=120, height=40)
+ Button(delete_frame, text='立即删除', font=('宋体', 15, 'bold'), fg="#000000", bg="#ffffff",
+ command=lambda: self.delete_com(delete_com_code)).place(x=340, y=325, width=120, height=40)
+ delete.mainloop()
+#05-1删除查询商品
+ def delete_inquire_com(self,delete_com_code):
+ sql="select *from commodity where com_code=%s" % delete_com_code.get()
+ self.cursor.execute(sql)
+ result=self.cursor.fetchall()
+ self.conn.commit()
+ if len(result) !=0:
+ com = commodity(result[0][0], result[0][1], result[0][2], result[0][3], )
+ com_name_label.config(text=com.get_commodity()['com_name'])
+ com_price_label.config(text=com.get_commodity()['com_price'])
+ com_stock_label.config(text=com.get_commodity()['com_stock'])
+ else:
+ com_name_label.config(text='为未查询到相关的商品')
+ com_price_label.config(text='为未查询到相关的商品')
+ com_stock_label.config(text='为未查询到相关的商品')
+#05-2删除商品
+ def delete_com(self,delete_com_code):
+ sql='delete from commodity where com_code=%s' % delete_com_code.get()
+ self.cursor.execute(sql)
+ # result=self.cursor.fetchall()
+ self.conn.commit()
+ messagebox.showinfo('提示', '删除成功')
+ # if len(result)==0:
+ # messagebox.showinfo('提示','删除成功')
+ # else:
+ # messagebox.showinfo('提示','删除失败')
+#06关于界面
+ def index_about(self):
+ about = Tk()
+ w = 600
+ h = 400
+ x = (about.winfo_screenwidth() - w) / 2
+ y = (about.winfo_screenheight() - h) / 2
+ about.geometry('%dx%d+%d+%d' % (w, h, x, y))
+ about.title('关于')
+ about.resizable(width=False, height=False)
+ about_frame = Frame(about, bg='#68b8be', width=600, height=400)
+ about_frame.pack()
+ about_font_1 = tkFont.Font(family='宋体', size=16, weight=tkFont.BOLD)
+ Label(about_frame, text='python超市管理系统', font=about_font_1, bg='#68b8be').place(x=200, y=90)
+ Label(about_frame, text='2024年', font=about_font_1, bg='#68b8be').place(x=200, y=130)
+ Label(about_frame, text='xiaoxiaojing', font=about_font_1, bg='#68b8be').place(x=200, y=160)
+ about.mainloop()
+
+
+#07退出
+ def index_quit(self):
+ self.conn.close()
+ self.master.destroy()
\ No newline at end of file
diff --git a/login.py b/login.py
new file mode 100644
index 0000000..04ce41c
--- /dev/null
+++ b/login.py
@@ -0,0 +1,102 @@
+import tkinter
+import pymssql
+import tkinter.font as tkFont
+from tkinter import *
+from tkinter import messagebox
+from index import Application as index_ui#登录成功进入主页
+
+# 登陆界面UI设计与功能实现
+class Application(Frame):
+ # 初始参数
+ def __init__(self, master=None):
+ super().__init__(master)
+ self.master = master
+ self.pack()
+ self.username = tkinter.StringVar()
+ self.password = tkinter.StringVar()
+ self.createWidget()
+
+ # 界面设计
+ def createWidget(self):
+ # 设置背景图片
+ global photo_login
+ photo_login = PhotoImage(file='./s/bg.gif')
+ self.lable_bg = Label(self,image=photo_login)
+ self.lable_bg.pack()
+ # 欢迎语区域设计
+ global photo_login_center
+ photo_login_center = PhotoImage(file='./s/bg.gif')
+ label_login_center = Label(self, image=photo_login_center, width='600', height='340')
+ label_login_center.place(x=100, y=100)
+ welcome_font_1 = tkFont.Font(family='宋体', size=30, weight=tkFont.BOLD)
+ label_welcome_1 = Label(self, text="Welcome", font=welcome_font_1,bg='#56cdff')
+ label_welcome_1.place(x=175, y=170)
+ welcome_font_2 = tkFont.Font(family='宋体', size=20, weight=tkFont.BOLD)
+ label_welcome_2 = Label(self, text="欢迎登陆python", font=welcome_font_2, bg='#6BF0B9')
+ label_welcome_2.place(x=160, y=250)
+ label_welcome_3 = Label(self, text="超市管理系统", font=welcome_font_2, bg='#56cdff')
+ label_welcome_3.place(x=170, y=320)
+ # 数据输入区
+ login_font = tkFont.Font(family='宋体', size=15)
+ login_user = Label(self, text='账号', font=login_font, bg='#ffffff')
+ login_user.place(x=430, y=160)
+ Entry(self, highlightthickness=1, font=("宋体", 15), bg="#f3f3f4", textvariable=self.username).place(x=430,y=193,width=240,height=40)
+ login_pass = Label(self, text='密码:', font=login_font, bg='#ffffff')
+ login_pass.place(x=430, y=240)
+ Entry(self, highlightthickness=1, font=("宋体", 15), bg="#f3f3f4", show='*', textvariable=self.password).place(x=430, y=270, width=240, height=40)
+ Button(self, text='立即登录', font=('宋体', 15, 'bold'), fg='#000000', bg='#56cdff', command=self.login).place(x=430, y=340, width=240, height=40)
+
+ # 登陆方法
+ def login(self):
+ errMessage = ""
+ username = self.username.get()
+ password = self.password.get()
+ new_errMessage = self.login_verity(username, password)
+ errMessage = str(errMessage) + str(new_errMessage)
+ if errMessage != "":
+ messagebox.showinfo("提示", errMessage)
+ self.password.set('')
+ if new_errMessage == "登陆成功":
+ self.login_destroy()
+ # 加载index界面
+ index_ui(self.master)
+
+ # 登录校验
+ def login_verity(self, username, paassword):
+ errMessage = ""
+ result = False
+ if len(username) == 0:
+ errMessage = errMessage + "用户名不能为空!!"
+ elif len(paassword) == 0:
+ errMessage = errMessage + "密码不能为空!!"
+ else:
+ result = self.login_db(username, paassword)
+ if result is True:
+ errMessage = errMessage + "登陆成功"
+ else:
+ errMessage = errMessage + "用户名或密码错误"
+ return errMessage
+
+ # 登陆处理
+ def login_db(self, username, password):
+ print(username, password)
+ server = "LAPTOP-7PS55P1C"
+ user = "sa"
+ pwd = "123456"
+ db = "fruit"
+ conn = pymssql.connect(server, user, pwd, db, tds_version="7.0")
+ # 创建游标对象
+ cursor = conn.cursor()
+ sql = 'select * from userInfo where username=' + username + ' and password=' + password + ''
+ cursor.execute(sql)
+ result = cursor.fetchall()
+ conn.commit()
+ conn.close()
+ if len(result) == 0:
+ return False
+ else:
+ return True
+
+ # 销毁界面
+ def login_destroy(self):
+ self.destroy()
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..461e974
--- /dev/null
+++ b/main.py
@@ -0,0 +1,16 @@
+from tkinter import *
+from login import Application as login
+
+if __name__ == '__main__':
+ win = Tk()
+ win.title('超市')
+ w=800
+ h=540
+ sw=win.winfo_screenwidth()
+ sh=win.winfo_screenheight()
+ x=(sw-w)/2
+ y=(sh-h)/2
+ win.geometry('%dx%d+%d+%d' % (w,h,x,y))
+ win.resizable(width=False, height=False)
+ login(master=win)
+ win.mainloop()
diff --git a/output.txt b/output.txt
new file mode 100644
index 0000000..ac1d8d2
--- /dev/null
+++ b/output.txt
@@ -0,0 +1 @@
+8522
\ No newline at end of file
diff --git a/s/1.gif b/s/1.gif
new file mode 100644
index 0000000000000000000000000000000000000000..0bf6d3f8888059509fecd0ac047ceae792f0baf4
GIT binary patch
literal 1400881
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 |