帮我写一个记账本代码,具体要求: (1)使用类实现数据封装; (2)使用tkinter实现界面UI设计。 (3)使用文件保存数据。 (4)能实现用户登陆功能和实现数据的增加、修改、删除和查询操作,并且每行要解释代码用什么作用的
时间: 2024-03-18 14:41:56 浏览: 74
好的,我会根据要求为您提供一个简单的记账本代码,如下所示:
```python
import tkinter as tk
import os
class AccountBook:
def __init__(self):
self.username = ''
self.password = ''
self.data_file = 'account_data.txt'
self.data = {}
def login(self):
# 登陆界面
login_window = tk.Tk()
login_window.title('登陆')
login_window.geometry('300x200')
# 用户名标签和输入框
username_label = tk.Label(login_window, text='用户名:')
username_label.pack()
username_entry = tk.Entry(login_window)
username_entry.pack()
# 密码标签和输入框
password_label = tk.Label(login_window, text='密码:')
password_label.pack()
password_entry = tk.Entry(login_window, show='*')
password_entry.pack()
# 登陆按钮
login_button = tk.Button(login_window, text='登陆', command=lambda:self.check_login(login_window, username_entry.get(), password_entry.get()))
login_button.pack()
login_window.mainloop()
def check_login(self, login_window, username, password):
# 检查用户名和密码是否匹配
if (username == self.username) and (password == self.password):
# 登陆成功,关闭登陆窗口,打开主界面
login_window.destroy()
self.main_window()
else:
# 登陆失败,弹出提示框
tk.messagebox.showerror('错误', '用户名或密码错误!')
def main_window(self):
# 主界面
main_window = tk.Tk()
main_window.title('记账本')
main_window.geometry('500x400')
# 菜单栏
menu_bar = tk.Menu(main_window)
# 文件菜单
file_menu = tk.Menu(menu_bar, tearoff=0)
file_menu.add_command(label='打开', command=self.load_data)
file_menu.add_command(label='保存', command=self.save_data)
file_menu.add_separator()
file_menu.add_command(label='退出', command=main_window.quit)
menu_bar.add_cascade(label='文件', menu=file_menu)
# 操作菜单
action_menu = tk.Menu(menu_bar, tearoff=0)
action_menu.add_command(label='增加', command=self.add_data)
action_menu.add_command(label='修改', command=self.modify_data)
action_menu.add_command(label='删除', command=self.delete_data)
action_menu.add_command(label='查询', command=self.query_data)
menu_bar.add_cascade(label='操作', menu=action_menu)
main_window.config(menu=menu_bar)
# 显示数据的列表框
data_listbox = tk.Listbox(main_window, width=70)
data_listbox.pack()
# 显示数据总数的标签
count_label = tk.Label(main_window, text='总共有 0 条记录')
count_label.pack()
# 加载数据
self.load_data()
# 更新数据列表和数据总数标签
self.update_data_listbox(data_listbox, count_label)
main_window.mainloop()
def load_data(self):
# 加载数据
if os.path.exists(self.data_file):
with open(self.data_file, 'r') as f:
for line in f:
line = line.strip()
if line != '':
fields = line.split(',')
self.data[fields[0]] = fields[1:]
def save_data(self):
# 保存数据
with open(self.data_file, 'w') as f:
for key in self.data.keys():
f.write(key + ',' + ','.join(self.data[key]) + '\n')
def add_data(self):
# 增加数据
add_window = tk.Tk()
add_window.title('增加数据')
add_window.geometry('300x200')
# 名称标签和输入框
name_label = tk.Label(add_window, text='名称:')
name_label.pack()
name_entry = tk.Entry(add_window)
name_entry.pack()
# 金额标签和输入框
amount_label = tk.Label(add_window, text='金额:')
amount_label.pack()
amount_entry = tk.Entry(add_window)
amount_entry.pack()
# 确认按钮
confirm_button = tk.Button(add_window, text='确认', command=lambda:self.confirm_add_data(add_window, name_entry.get(), amount_entry.get()))
confirm_button.pack()
add_window.mainloop()
def confirm_add_data(self, add_window, name, amount):
# 确认增加数据
if name in self.data.keys():
# 名称已存在,弹出提示框
tk.messagebox.showerror('错误', '名称已存在!')
else:
# 名称不存在,增加数据
self.data[name] = [amount]
add_window.destroy()
def modify_data(self):
# 修改数据
modify_window = tk.Tk()
modify_window.title('修改数据')
modify_window.geometry('300x200')
# 名称标签和输入框
name_label = tk.Label(modify_window, text='名称:')
name_label.pack()
name_entry = tk.Entry(modify_window)
name_entry.pack()
# 金额标签和输入框
amount_label = tk.Label(modify_window, text='金额:')
amount_label.pack()
amount_entry = tk.Entry(modify_window)
amount_entry.pack()
# 确认按钮
confirm_button = tk.Button(modify_window, text='确认', command=lambda:self.confirm_modify_data(modify_window, name_entry.get(), amount_entry.get()))
confirm_button.pack()
modify_window.mainloop()
def confirm_modify_data(self, modify_window, name, amount):
# 确认修改数据
if name not in self.data.keys():
# 名称不存在,弹出提示框
tk.messagebox.showerror('错误', '名称不存在!')
else:
# 名称存在,修改数据
self.data[name][0] = amount
modify_window.destroy()
def delete_data(self):
# 删除数据
delete_window = tk.Tk()
delete_window.title('删除数据')
delete_window.geometry('300x200')
# 名称标签和输入框
name_label = tk.Label(delete_window, text='名称:')
name_label.pack()
name_entry = tk.Entry(delete_window)
name_entry.pack()
# 确认按钮
confirm_button = tk.Button(delete_window, text='确认', command=lambda:self.confirm_delete_data(delete_window, name_entry.get()))
confirm_button.pack()
delete_window.mainloop()
def confirm_delete_data(self, delete_window, name):
# 确认删除数据
if name not in self.data.keys():
# 名称不存在,弹出提示框
tk.messagebox.showerror('错误', '名称不存在!')
else:
# 名称存在,删除数据
del self.data[name]
delete_window.destroy()
def query_data(self):
# 查询数据
query_window = tk.Tk()
query_window.title('查询数据')
query_window.geometry('300x200')
# 名称标签和输入框
name_label = tk.Label(query_window, text='名称:')
name_label.pack()
name_entry = tk.Entry(query_window)
name_entry.pack()
# 显示数据的列表框
data_listbox = tk.Listbox(query_window, width=70)
data_listbox.pack()
# 查询按钮
query_button = tk.Button(query_window, text='查询', command=lambda:self.query_data_listbox(data_listbox, name_entry.get()))
query_button.pack()
query_window.mainloop()
def update_data_listbox(self, data_listbox, count_label):
# 更新数据列表和数据总数标签
data_listbox.delete(0, tk.END)
for key in self.data.keys():
data_listbox.insert(tk.END, key + ': ' + self.data[key][0])
count_label.config(text='总共有 ' + str(len(self.data)) + ' 条记录')
def query_data_listbox(self, data_listbox, name):
# 查询数据列表
data_listbox.delete(0, tk.END)
if name in self.data.keys():
data_listbox.insert(tk.END, name + ': ' + self.data[name][0])
else:
tk.messagebox.showerror('错误', '名称不存在!')
if __name__ == '__main__':
account_book = AccountBook()
account_book.username = 'admin'
account_book.password = '123456'
account_book.login()
```
解释:
1. `AccountBook` 类:记账本类,封装了一些方法和属性;
2. `login` 方法:登陆界面,使用 `tkinter` 实现界面;
3. `check_login` 方法:检查用户名和密码是否匹配,登陆成功后关闭登陆窗口,打开主界面;
4. `main_window` 方法:主界面,使用 `tkinter` 实现界面;
5. `load_data` 方法:加载数据,从文件中读取数据到 `self.data` 字典中;
6. `save_data` 方法:保存数据,将 `self.data` 字典中的数据写入文件中;
7. `add_data` 方法:增加数据,弹出增加数据窗口,输入名称和金额,确认后增加数据;
8. `modify_data` 方法:修改数据,弹出修改数据窗口,输入名称和金额,确认后修改数据;
9. `delete_data` 方法:删除数据,弹出删除数据窗口,输入名称,确认后删除数据;
10. `query_data` 方法:查询数据,弹出查询数据窗口,输入名称,查询后显示数据;
11. `update_data_listbox` 方法:更新数据列表和数据总数标签,将 `self.data` 字典中的数据显示在列表框中;
12. `query_data_listbox` 方法:查询数据列表,将指定名称的数据显示在列表框中;
13. `__init__` 方法:初始化属性;
14. `username` 属性:用户名;
15. `password` 属性:密码;
16. `data_file` 属性:数据文件名;
17. `data` 属性:数据字典。
阅读全文