记账程序由来
曾经在iOS14的快截指令中写了一个快捷指令用来记账,但是由于快捷指令的限制,只能把数据记录到备忘录或者numbers,数据的迁移性很差。所以最后干脆用python写了一个程序
程序介绍
模块
此程序用到的模块较少,内容如下,缺失的模块请自行安装:
- openpyxl:xlsx文件读写常用的模块。
- datetime:日期模块,用来获取你记账的时间。
- tkinter:图形化模块,用来制作可视化操作界面。
- os:自带模块,操作文件,无需安装。
数据写入
新建文件同时,在首行写入标题,并把datetime获取的时间字符串赋值给a;把消费类型赋值给b,消费金额赋值给c。然后用append把a,b,c的数值追加到工作簿中。由于日期字段过长,这里预先把日期列设置列宽为20。
zb = openpyxl.Workbook() xf = zb.active xf['A1'] = '日期' xf['B1'] = '消费类型' xf['C1'] = '消费金额' a = datetime.datetime.now() b = Entry1.get() c = Entry2.get() xf.append([a, b, c]) xf.column_dimensions['A'].width = 20 zb.save('个人账本.xlsx') 1234567891011
gui图形化界面
做了一个简单的界面,包括两个输入框加两个按钮。
jzr.title('记账本') jzr.geometry('300x120+700+300') label1 = Label(jzr, text='消费种类:', font=('微软雅黑', 10), fg='green') label1.grid(row=0, column=0) label2 = Label(jzr, text='消费金额:', font=('微软雅黑', 10), fg='green') label2.grid(row=1, column=0) Entry1 = Entry(jzr, font=('微软雅黑', 12), width=16) Entry1.grid(row=0, column=1) Entry2 = Entry(jzr, font=('微软雅黑', 12), width=16) Entry2.grid(row=1, column=1) Button1 = Button(jzr, text='写入数据', font=('微软雅黑', 10), width=8, command=jzcx) Button1.grid(row=3, column=0, sticky=W) Button2 = Button(jzr, text='退出', font=('微软雅黑', 10), width=8, command=jzr.quit) Button2.grid(row=3, column=1, sticky=E) jzr.mainloop() 123456789101112131415
关于输入空值
如果输入框没有填写数据,则不记录数据,这里使用了一个if函数。
if con1 == '': messagebox.showinfo('提示', message='请输入消费类型') elif con2 == '': messagebox.showinfo('提示', message='请输入消费金额') else: 12345
新建工作簿
程序运行后,如果是首次运行,则会新建一个名为“个人账本”的工作簿,再写入数据;如果工作簿已存在,则读取并新增加数据。这里使用if结构,并且嵌套在上面的if判断语句中。
else: if os.path.exists('个人账本.xlsx'): filepath = '个人账本.xlsx' zb = openpyxl.load_workbook(filepath) xf = zb.active a = datetime.datetime.now() b = Entry1.get() c = Entry2.get() xf.append([a, b, c]) xf.column_dimensions['A'].width = 20 zb.save('个人账本.xlsx') messagebox.showinfo('提示', message='消费数据已记录完成') jzr.quit() else: zb = openpyxl.Workbook() xf = zb.active xf['A1'] = '日期' xf['B1'] = '消费类型' xf['C1'] = '消费金额' a = datetime.datetime.now() b = Entry1.get() c = Entry2.get() xf.append([a, b, c]) xf.column_dimensions['A'].width = 20 zb.save('个人账本.xlsx') messagebox.showinfo('提示', message='消费数据已记录完成') jzr.quit() 123456789101112131415161718192021222324252627
完整代码
import openpyxl from openpyxl import Workbook import datetime from tkinter import messagebox from tkinter import * import os jzr = Tk() jzr.title('记账本') jzr.geometry('300x120+700+300') label1 = Label(jzr, text='消费种类:', font=('微软雅黑', 10), fg='green') label1.grid(row=0, column=0) label2 = Label(jzr, text='消费金额:', font=('微软雅黑', 10), fg='green') label2.grid(row=1, column=0) Entry1 = Entry(jzr, font=('微软雅黑', 12), width=16) Entry1.grid(row=0, column=1) Entry2 = Entry(jzr, font=('微软雅黑', 12), width=16) Entry2.grid(row=1, column=1) def jzcx(): con1 = Entry1.get() con1 = con1.strip() con2 = Entry2.get() con2 = con2.strip() if con1 == '': messagebox.showinfo('提示', message='请输入消费类型') elif con2 == '': messagebox.showinfo('提示', message='请输入消费金额') else: if os.path.exists('个人账本.xlsx'): filepath = '个人账本.xlsx' zb = openpyxl.load_workbook(filepath) xf = zb.active a = datetime.datetime.now() b = Entry1.get() c = Entry2.get() xf.append([a, b, c]) xf.column_dimensions['A'].width = 20 zb.save('个人账本.xlsx') messagebox.showinfo('提示', message='消费数据已记录完成') jzr.quit() else: zb = openpyxl.Workbook() xf = zb.active xf['A1'] = '日期' xf['B1'] = '消费类型' xf['C1'] = '消费金额' a = datetime.datetime.now() b = Entry1.get() c = Entry2.get() xf.append([a, b, c]) xf.column_dimensions['A'].width = 20 zb.save('个人账本.xlsx') messagebox.showinfo('提示', message='消费数据已记录完成') jzr.quit() Button1 = Button(jzr, text='写入数据', font=('微软雅黑', 10), width=8, command=jzcx) Button1.grid(row=3, column=0, sticky=W) Button2 = Button(jzr, text='退出', font=('微软雅黑', 10), width=8, command=jzr.quit) Button2.grid(row=3, column=1, sticky=E) jzr.mainloop()