项目分析
- 开发准备:pycharm、json模块、datetime模块、PySimpleGUI模块
- 数据保存:利用Json文件保存账目数据(这里不使用数据库的话,数据太过简单,牛刀小用)
- 编写步骤:
- 1.建立数据文件 2.读取数据函数 3.读写数据函数 4.编写界面(最后)
- 5.账单显示函数 6.总收入计算函数 7.总支出计算函数 8.增加账目函数
- 9.结合界面调用函数实现项目内容
编写步骤
1.建立数据文件
# -*- codeing = utf-8 -*-
# @Time :2022/5/16
# @Author :季白九月
# @File :记账本.py
# @Software: PyCharm
import json
import datetime
import PySimpleGUI
d = '[{"时间":"2022/05/16 19:13:22","项目":"收到货款","金额":20000,"分类":"收入"}]'
with open(r"data.txt","w") as f:
f.write(d)
2.读取数据函数
def readData(): #读取数据函数
with open(r"data.txt", "r") as f:
jsonData = f.read()
dataList = json.loads(jsonData) #读取文件里面的数据
return dataList
3.读写数据函数
def writeData(dateList): ##写数据函数
jsonData = json.dumps(dateList,ensure_ascii=False) #数据里有汉字,确保不会更改编码格式
with open(r"data.txt", "w") as f:
jsonData = f.write(jsonData)
sg.popup('账单录入成功') #弹窗
4.账单显示函数
def showData():
data = readData()
dataLists =[]
for d in data:
if d["分类"] == "收入": #判断是支出还是收入?
dataList = [d["时间"],d["项目"],d["金额"],d["分类"]]
dataLists.append(dataList)
else:
dataList = [d["时间"], d["项目"], d["金额"]*-1, d["分类"]]
dataLists.append(dataList)
return dataLists
5.总收入计算函数
def sumin(): #总收入计算函数
sumin= 0
data = readData()
for a in data:
if a["分类"]=="收入":
sumin+=a["金额"]
return sumin
6.总支出计算函数
def sumout(): #总支出计算函数
sumout= 0
data = readData()
for a in data:
if a["分类"]=="支出":
sumout+=a["金额"]
return sumout
7.增加账目函数
def addData(项目,金额,分类): #增加账目函数
dataList = readData()
t = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%s") #获取系统时间,并规定格式
data = {"":t,"":项目,"":金额,"":分类}
dataList.append(data)
writeData(dataList)
8.编写界面(最后)
def main():
list = showData()
layout = [
[sg.T("账目清单:")],
[sg.Table(list,headings=["时间","项目","金额","分类"],
key = "-show-",
justification="c",
auto_size_columns=False, #设置显示 列宽参数
def_col_width=15
)],
[sg.T("总收入多少钱,总支出多少元,结余多少元")],
[sg.T("请输入账单项目:"),sg.In()],
[sg.T("请输入账单金额:"),sg.In()],
[sg.T("请选择账单分类:")]+[sg.Radio(i,group_id=1,key=i)for i in ["收入","支出"]],
[sg.B("确认提交")]
]
window = sg.Window("记账本",layout)
while True:
event,values = window.read()
if event == None:
break
window.close()
9.结合界面调用函数实现项目内容
更新收入、支出、结余动态更新,在主函数中,其中有一些PySimpleGUI图形界面的编程知识,我也是刚入门,同有许多不懂的地方,尽量多做注释,方便理解
def main():
list = showData()
sin = sumin()
sout = sumout()
layout = [
[sg.T("账目清单:")],
[sg.Table(list,headings=["时间","项目","金额","分类"],
key = "-show-",
justification="c",
auto_size_columns=False, #设置显示 列宽参数
def_col_width=15
)],
[sg.T("总收入"+str(sin)+"钱,总支出"+str(sout)+"元,结余"+str(sin-sout)+"元",key = "-text-")],
[sg.T("请输入账单项目:"),sg.In(key="-项目-")],
[sg.T("请输入账单金额:"),sg.In(key="-金额-")],
[sg.T("请选择账单分类:")]+[sg.Radio(i,group_id=1,key=i)for i in ["收入","支出"]],
[sg.B("确认提交")]
]
window = sg.Window("记账本",layout)
while True:
event,values = window.read()
if event =="确认提交":
项目 = values["-项目-"]
金额 = float(values["-金额-"])
for k,v in values.items(): #遍历单选框的键和值
if v==True:
分类=k
addData(项目,金额,分类)
list = showData()
sin = sumin()
sout = sumout()
text = "总收入"+str(sin)+"钱,总支出"+str(sout)+"元,结余"+str(sin-sout)+"元"
window["-show-"].update(values=list) #显示在 目录上
window["-text-"].update(value=text) #重新显示 "总收入"+str(sin)+"钱,总支出"+str(sout)+"元,结余"+str(sin-sout)+"元"
window["-项目-"].update("")
window["-金额-"].update("") # 将文本框更新 为空,方便再次输入
if event == None:
break
window.close()
if __name__ == '__main__':
main()
至此,这个桌面程序就完成了!