托尔斯泰
# -*- coding:gb2312 -*- from tkinter import ttk from tkinter import * from tkinter import messagebox class JXC(object): def __init__(self): self.filename = '简易进销存数据.txt' self.buyIndex = 0 self.sellIndex = 0 self.queryIndex = 0 self.allList = {} self.tempList = {} self.dateList = [] '''初始顶层框架''' self.top = Tk() self.top.title('简易进销存 1.0') self.top.geometry('960x720') self.top.resizable(0, 0) """set start page Label""" self.startLabel = Label(self.top, text='简易进销存 ', font=('Arial', 16, 'bold')) self.startLabel.pack(fill=X, expand=0) """set options button """ self.optFrm = Frame(self.top, height=10) self.optFrm.pack(fill=X, expand=0) self.startBtn = Button(self.optFrm, text='首页', width=10, command=self.showStartFrm) self.startBtn.pack(side=LEFT) self.buyBtn = Button(self.optFrm, text='进货信息', width=10, command=self.showBuyFrm) self.buyBtn.pack(side=LEFT) self.sellBtn = Button(self.optFrm, text='出货信息', width=10, command=self.showSellFrm) self.sellBtn.pack(side=LEFT) self.queryBtn = Button(self.optFrm, text='查询', width=10, command=self.showQueryFrm) self.queryBtn.pack(side=LEFT) """start page Frame""" self.startFrm = Frame(self.top) """buy page Frame""" self.buyFrm = Frame(self.top) """sell page Frame""" self.sellFrm = Frame(self.top) """sell query Frame""" self.queryFrm = Frame(self.top) def showStartFrm(self): self.startFrm.pack(fill='both', expand=1) self.buyFrm.pack_forget() self.sellFrm.pack_forget() self.queryFrm.pack_forget() def showBuyFrm(self): self.startFrm.pack_forget() self.buyFrm.pack(fill='both', expand=1) self.sellFrm.pack_forget() self.queryFrm.pack_forget() def showSellFrm(self): self.startFrm.pack_forget() self.buyFrm.pack_forget() self.sellFrm.pack(fill='both', expand=1) self.queryFrm.pack_forget() def showQueryFrm(self): self.startFrm.pack_forget() self.buyFrm.pack_forget() self.sellFrm.pack_forget() self.queryFrm.pack(fill='both', expand=1) def setStartSubFrm(self): illustrationText = """" 使用说明 《进货信息》 用于添加新的进货订单,在‘已添加的新的进货订单’下可以查看当前添加的进货订单 《出货信息》 用于添加新的进货订单,在‘已添加的新的出货订单’下可以查看当前添加的出货订单 《查询》 用于查询往日的流水信息,已经每天的库存信息 """ self.illustrLabel = Label(self.startFrm, text=illustrationText, font=('Arial', 14, 'bold')) self.illustrLabel.pack() def setBuySubFrm(self): option = ['订单日期', '物品名称', '物品编号', '进货价格', '进货数量', '进货厂商'] labelText = ['添加新的进货订货单', '已添加的进货订单'] self.subBuyFrmUp = Frame(self.buyFrm) self.subBuyFrmUp.pack(fill=X, expand=0) self.subBuyFrmDown = Frame(self.buyFrm) self.subBuyFrmDown.pack(fill=X, expand=0) self.addBuyInfoLabel = Label(self.subBuyFrmUp, text=labelText[0], font=('Arial', 14, 'bold'), bg='gray') self.addBuyInfoLabel.pack(fill=X, expand=0) self.subBuyFrmUpOperate = Frame(self.subBuyFrmUp) self.subBuyFrmUpOperate.pack() self.showBuyInfoLabel = Label(self.subBuyFrmDown, text=labelText[1], font=('Arial', 14, 'bold'), bg='gray') self.showBuyInfoLabel.pack(fill=X, expand=0) self.subBuyFrmDownShow = Frame(self.subBuyFrmDown) self.subBuyFrmDownShow.pack() """Input""" self.dateBuyLabel = Label(self.subBuyFrmUpOperate, text=option[0], font=('Arial', 12), width=15) self.dateBuyLabel.grid(row=0, column=0, columnspan=15) self.itemBuyLabel = Label(self.subBuyFrmUpOperate, text=option[1], font=('Arial', 12), width=15) self.itemBuyLabel.grid(row=1, column=0, columnspan=15) self.identBuyLabel = Label(self.subBuyFrmUpOperate, text=option[2], font=('Arial', 12), width=15) self.identBuyLabel.grid(row=2, column=0, columnspan=15) self.priBuyLabel = Label(self.subBuyFrmUpOperate, text=option[3], font=('Arial', 12), width=15) self.priBuyLabel.grid(row=3, column=0, columnspan=15) self.numBuyLabel = Label(self.subBuyFrmUpOperate, text=option[4], font=('Arial', 12), width=15) self.numBuyLabel.grid(row=4, column=0, columnspan=15) self.whereBuyLabel = Label(self.subBuyFrmUpOperate, text=option[5], font=('Arial', 12), width=15) self.whereBuyLabel.grid(row=5, column=0, columnspan=15) self.dateBuyEntry = Entry(self.subBuyFrmUpOperate, text=option[0], font=('Arial', 12), width=25) self.dateBuyEntry.grid(row=0, column=15, columnspan=15) self.itemBuyEntry = Entry(self.subBuyFrmUpOperate, text=option[1], font=('Arial', 12), width=25) self.itemBuyEntry.grid(row=1, column=15, columnspan=15) self.identBuyEntry = Entry(self.subBuyFrmUpOperate, text=option[2], font=('Arial', 12), width=25) self.identBuyEntry.grid(row=2, column=15, columnspan=15) self.priBuyEntry = Entry(self.subBuyFrmUpOperate, text=option[3], font=('Arial', 12), width=25) self.priBuyEntry.grid(row=3, column=15, columnspan=15) self.numBuyEntry = Entry(self.subBuyFrmUpOperate, text=option[4], font=('Arial', 12), width=25) self.numBuyEntry.grid(row=4, column=15, columnspan=15) self.whereBuyEntry = Entry(self.subBuyFrmUpOperate, text=option[5], font=('Arial', 12), width=25) self.whereBuyEntry.grid(row=5, column=15, columnspan=15) self.clcBuyBtn = Button(self.subBuyFrmUpOperate, text='清除', activebackground='gray', command=self.clearBuyEntry) self.clcBuyBtn.grid(row=7, column=15, columnspan=5) self.saveBuyBtn = Button(self.subBuyFrmUpOperate, text='保存', activebackground='gray', command=self.showBuyInfo) self.saveBuyBtn.grid(row=7, column=26, columnspan=5) """show""" self.treeBuy = ttk.Treeview(self.subBuyFrmDownShow, height=20) self.treeBuy['column'] = tuple(option) self.treeBuy.heading("#0", text='订单序号') self.treeBuy.column("#0", minwidth=0, width=140) for item in option: self.treeBuy.column(item, minwidth=0, width=140) self.treeBuy.heading(item, text=item) self.treeBuy.pack() def setSellSubFrm(self): option = ['订单日期', '物品名称', '物品编号', '销售价格', '销售数量', '客户信息'] labelText = ['添加新的销售订货单', '已添加的销售订单'] self.subSellFrmUp = Frame(self.sellFrm) self.subSellFrmUp.pack(fill=X, expand=0) self.subSellFrmDown = Frame(self.sellFrm) self.subSellFrmDown.pack(fill=X, expand=0) self.addSellInfoLabel = Label(self.subSellFrmUp, text=labelText[0], font=('Arial', 14, 'bold'), bg='gray') self.addSellInfoLabel.pack(fill=X, expand=0) self.subSellFrmUpOperate = Frame(self.subSellFrmUp) self.subSellFrmUpOperate.pack() self.showSellInfoLabel = Label(self.subSellFrmDown, text=labelText[1], font=('Arial', 14, 'bold'), bg='gray') self.showSellInfoLabel.pack(fill=X, expand=0) self.subSellFrmDownShow = Frame(self.subSellFrmDown) self.subSellFrmDownShow.pack() """Input""" self.dateSellLabel = Label(self.subSellFrmUpOperate, text=option[0], font=('Arial', 12), width=15) self.dateSellLabel.grid(row=0, column=0, columnspan=15) self.itemSellLabel = Label(self.subSellFrmUpOperate, text=option[1], font=('Arial', 12), width=15) self.itemSellLabel.grid(row=1, column=0, columnspan=15) self.identSellLabel = Label(self.subSellFrmUpOperate, text=option[2], font=('Arial', 12), width=15) self.identSellLabel.grid(row=2, column=0, columnspan=15) self.priSellLabel = Label(self.subSellFrmUpOperate, text=option[3], font=('Arial', 12), width=15) self.priSellLabel.grid(row=3, column=0, columnspan=15) self.numSellLabel = Label(self.subSellFrmUpOperate, text=option[4], font=('Arial', 12), width=15) self.numSellLabel.grid(row=4, column=0, columnspan=15) self.whereSellLabel = Label(self.subSellFrmUpOperate, text=option[5], font=('Arial', 12), width=15) self.whereSellLabel.grid(row=5, column=0, columnspan=15) self.dateSellEntry = Entry(self.subSellFrmUpOperate, text=option[0], font=('Arial', 12), width=25) self.dateSellEntry.grid(row=0, column=15, columnspan=15) self.itemSellEntry = Entry(self.subSellFrmUpOperate, text=option[1], font=('Arial', 12), width=25) self.itemSellEntry.grid(row=1, column=15, columnspan=15) self.identSellEntry = Entry(self.subSellFrmUpOperate, text=option[2], font=('Arial', 12), width=25) self.identSellEntry.grid(row=2, column=15, columnspan=15) self.priSellEntry = Entry(self.subSellFrmUpOperate, text=option[3], font=('Arial', 12), width=25) self.priSellEntry.grid(row=3, column=15, columnspan=15) self.numSellEntry = Entry(self.subSellFrmUpOperate, text=option[4], font=('Arial', 12), width=25) self.numSellEntry.grid(row=4, column=15, columnspan=15) self.whereSellEntry = Entry(self.subSellFrmUpOperate, text=option[5], font=('Arial', 12), width=25) self.whereSellEntry.grid(row=5, column=15, columnspan=15) self.clcSellBtn = Button(self.subSellFrmUpOperate, text='清除', activebackground='gray', command=self.clearSellEntry) self.clcSellBtn.grid(row=7, column=15, columnspan=5) self.saveSellBtn = Button(self.subSellFrmUpOperate, text='保存', activebackground='gray', command=self.showSellInfo) self.saveSellBtn.grid(row=7, column=26, columnspan=5) """show""" self.treeSell = ttk.Treeview(self.subSellFrmDownShow, height=20) self.treeSell['column'] = tuple(option) self.treeSell.heading("#0", text='订单序号') self.treeSell.column("#0", minwidth=0, width=140) for item in option: self.treeSell.column(item, minwidth=0, width=140) self.treeSell.heading(item, text=item) self.treeSell.pack() def setQueryFrm(self): self.queryUpFrm = Frame(self.queryFrm) self.queryUpFrm.pack(fill=X, expand=0) self.queryDownFrm = Frame(self.queryFrm) self.queryDownFrm.pack(fill=X, expand=0) self.queryUpInfoLabel = Label(self.queryUpFrm, text='查询日期') self.queryUpInfoLabel.grid(row=0, column=0, columnspan=5) self.queryUpEntryFirst = Entry(self.queryUpFrm) self.queryUpEntryFirst.grid(row=0, column=20, columnspan=5) self.queryUpInfoLabel = Label(self.queryUpFrm, text='---') self.queryUpInfoLabel.grid(row=0, column=26, columnspan=2) self.queryUpEntrySecond = Entry(self.queryUpFrm) self.queryUpEntrySecond.grid(row=0, column=28, columnspan=5) self.queryUpInfoBtn = Button(self.queryUpFrm, text='查询', activebackground='gray', command=self.queryData) self.queryUpInfoBtn.grid(row=0, column=35, columnspan=5) self.treeQuery = ttk.Treeview(self.queryDownFrm, height=30) option = ['物品名称', '物品编号', '物品价格', '进货数量', '进货厂商', '销售价格', '销售数量', '客户信息', '库存信息'] self.treeQuery['column'] = option self.treeQuery.heading("#0", text='日期') self.treeQuery.column("#0", minwidth=0, width=96) for item in option: self.treeQuery.heading(item, text=item) self.treeQuery.column(item, minwidth=0, width=96) self.treeQuery.pack() def getBuyInput(self): newInput = [] newInput.append(self.dateBuyEntry.get()) newInput.append(self.itemBuyEntry.get()) newInput.append(self.identBuyEntry.get()) newInput.append(self.priBuyEntry.get()) newInput.append(self.numBuyEntry.get()) newInput.append(self.whereBuyEntry.get()) return newInput def clearBuyEntry(self): self.itemBuyEntry.delete(0, END) self.identBuyEntry.delete(0, END) self.priBuyEntry.delete(0, END) self.numBuyEntry.delete(0, END) self.whereBuyEntry.delete(0, END) self.dateBuyEntry.delete(0, END) def showBuyInfo(self): val = messagebox.askyesno('警告', '保存该订单信息?') if val: messagebox.showinfo('提示', '订单信息保存成功!') order = self.getBuyInput() self.clearBuyEntry() self.updateTree(self.treeBuy, order) self.upDateTempList(order, 1) self.upDateAllList() self.saveDate() def getSellInput(self): newInput = [] newInput.append(self.dateSellEntry.get()) newInput.append(self.itemSellEntry.get()) newInput.append(self.identSellEntry.get()) newInput.append(self.priSellEntry.get()) newInput.append(self.numSellEntry.get()) newInput.append(self.whereSellEntry.get()) return newInput def clearSellEntry(self): self.itemSellEntry.delete(0, END) self.identSellEntry.delete(0, END) self.priSellEntry.delete(0, END) self.numSellEntry.delete(0, END) self.whereSellEntry.delete(0, END) self.dateSellEntry.delete(0, END) def showSellInfo(self): val = messagebox.askyesno('警告', '保存该订单信息?') if val: messagebox.showinfo('提示', '订单信息保存成功!') order = self.getSellInput() self.clearSellEntry() self.updateTree(self.treeSell, order) self.upDateTempList(order, 1) self.upDateAllList() self.saveDate() def queryData(self): dateIndex = self.getQueryDateIndex() print('dateIndex') if not dateIndex: return for index in range(dateIndex[0],dateIndex[1]): date = self.dateList[index] for resName in self.allList[date]['statement']: resDict = self.allList[date]['statement'][resName] inLen = len(resDict['In']) outLen = len(resDict['Out']) for infoIndex in range(0,max(inLen,outLen)): if infoIndex <= inLen-1 and infoIndex <= outLen-1: order = (date,resName,'',resDict['In'][0],resDict['In'][1],resDict['In'][2], \ resDict['Out'][0],resDict['Out'][1],resDict['Out'][2],) elif infoIndex <= inLen-1 and infoIndex > outLen-1: order = (date,resName,'',resDict['In'][0],resDict['In'][1],resDict['In'][2]) else: order = (date, resName, '','','','', resDict['Out'][0], resDict['Out'][1], resDict['Out'][2]) print(order) self.updateTree(self.queryIndex,order) def getQueryDateIndex(self): startDate = self.queryUpEntryFirst.get() endDate = self.queryUpEntrySecond.get() if endDate >= startDate: if not self.dateList: messagebox.showinfo('错误', '数据为空!') return[] if startDate>self.dateList[-1]: messagebox.showinfo('错误', '日期输入有误') return [] tempDateList = self.dateList tempDateList.append(startDate) tempDateList.append(endDate) tempSortDateList = sorted(tempDateList) startIndex = tempSortDateList.index(startDate) endIndex = tempSortDateList.index(endDate) if startIndex == 0: if endIndex == 0: return [0,0] else: return [0,endIndex] else: return [startIndex-1,endIndex] else: messagebox.showinfo('错误', '日期输入有误') return [] def updateTree(self, root, order): if root == self.treeBuy: root.insert('', self.buyIndex, text=self.buyIndex, values=order) self.buyIndex += 1 elif root == self.treeSell: root.insert('', self.sellIndex, text=self.sellIndex, values=order) self.sellIndex += 1 else: root.insert('', self.queryIndex, text=self.queryIndex, values=order) self.queryIndex += 1 def getAllList(self): self.filePointer = open(self.filename, 'a+') self.filePointer.seek(0) dateKey = '' dateValue = '' for line in self.filePointer.readlines(): if line[0] == '{': dateValue = eval(line.strip('\n')) elif line[0] !='\n': dateKey = line.strip('\n') if dateKey and dateValue: if dateKey not in self.dateList: self.dateList.append(dateKey) self.allList[dateKey] = dateValue else: for resName in dateValue['statement']: if resName not in self.allList[dateKey]['statement']: self.allList[dateKey]['statement'][resName] = dateValue['statement'][resName] else: self.allList[dateKey]['statement'][resName]['In'].\ append(dateValue['statement'][resName]['In']) self.allList[dateKey]['statement'][resName]['Out'].\ append(dateValue['statement'][resName]['Out']) #print(self.allList) def upDateAllList(self): if not self.tempList: pass for dateKey in self.tempList: if dateKey not in self.allList: self.allList[dateKey] = self.tempList[dateKey] else: for resName in self.temList[dateKey]['statement']: if resName not in self.tempList[dateKey]['statement']: self.allList[dateKey]['statement'][resName] = self.tempList[dateKey]['statement'][resName] def upDateTempList(self, newOrder, buyOrSell): self.tempList = {} dateKey = newOrder[0] resName = newOrder[1] if dateKey not in self.dateList: self.dateList.append(dateKey) if dateKey not in self.tempList: self.tempList[dateKey] = {'statement': {}, 'stock': {}} if resName in self.tempList[dateKey]['statement']: if buyOrSell: self.tempList[dateKey]['statement'][resName]['In'].append(order[3:]) else: self.tempList[dateKey]['statement'][resName]['Out'].append(order[3:]) else: self.tempList[dateKey]['statement'][resName]={'In':[],'Out':[]} if buyOrSell: self.tempList[dateKey]['statement'][resName]['In'].append(order[3:]) else: self.tempList[dateKey]['statement'][resName]['Out'].append(order[3:]) def saveDate(self): for date in self.tempList: self.filePointer.write(date+'\n') self.filePointer.write(str(self.tempList[date])+'\n') def start(self): self.setQueryFrm() self.setStartSubFrm() self.setBuySubFrm() self.setSellSubFrm() self.showStartFrm() self.getAllList() self.top.mainloop() def main(): jxc = JXC() jxc.start() if __name__ == '__main__': main()