# -*- 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()