记账程序由来
曾经在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')
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()
关于输入空值
如果输入框没有填写数据,则不记录数据,这里使用了一个if函数。
if con1 == '':
messagebox.showinfo('提示', message='请输入消费类型')
elif con2 == '':
messagebox.showinfo('提示', message='请输入消费金额')
else:
新建工作簿
程序运行后,如果是首次运行,则会新建一个名为“个人账本”的工作簿,再写入数据;如果工作簿已存在,则读取并新增加数据。这里使用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()
完整代码
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()