2022年 11月 4日

python之简易界面编程(模块搭建+界面搭建+功能完成)

目录

一,模块搭建

1,定义险种对象

2,重写构造

3,重写toString

4,文件写入

二,界面搭建

1,新建窗口

2,为窗口设置标题 

3,设置窗口大小 

4,编写窗口内容

5,显示窗口 

6,运行窗口 

三,功能完成

1,增加:追加

2,根据下标删除,移除元素,注意不是移除下标

注意:

manager包下recordManager文件,完整代码

 1,增加:

 2,删除

①获取被选中的行

②获取这行的数据(获取这行的字典对象,获取字典对象的值)

3,加载

①获取所有的元素

②清空元素

注意:END是一个常量

4,保存

main包下main文件,完整代码


一,模块搭建

1,定义险种对象

2,重写构造

3,重写toString

4,文件写入

pojo包下面的record文件,完整代码

  1. import pickle
  2. # 险种对象
  3. class Record:
  4. record_id: str
  5. record_name: str
  6. record_money: float
  7. record_type: str
  8. # 重写构造
  9. def __init__(self, record_id: str, record_name: str, record_money: str, record_type: str):
  10. self.record_id = record_id
  11. self.record_name = record_name
  12. self.record_money = record_money
  13. self.record_type = record_type
  14. # 重写toString方法
  15. def __str__(self):
  16. return f'编号{self.record_id}名字{self.record_name}金额{self.record_money}缴费类型{self.record_type}'
  17. if __name__=='__main__':
  18. r = Record('10001', '小宝', 3000, '医疗保险')
  19. print(r)
  20. # with open('record.txt','w',encoding='utf-8') as f:
  21. #报错 TypeError: write() argument must be str, not bytes
  22. # b binary 二进制
  23. # with open('record.txt', 'wb') as f:#wb写入二进制
  24. # pickle.dump(r,f)#把对象r放到文件f里
  25. with open('record.txt','rb') as f:
  26. print(pickle.load(f))

控制台运行结果

二,界面搭建

main包下的main文件

1,新建窗口

# 新建一个窗口
window=Tk()

2,为窗口设置标题 

# 设置标题
window.title('险种管理')

3,设置窗口大小 

# 设置大小  widthxheightt+x+y
window.geometry('400x400+200+200') 

4,编写窗口内容

# 编写控件Treeview
table = Treeview(columns=('id','name','money','type'),show='headings')
table.column('id',width=100)
table.column('name',width=100)
table.column('money',width=100)
table.column('type',width=100)
table.heading('id',text='记录编号')
table.heading('name',text='缴费者')
table.heading('money',text='缴费金额')
table.heading('type',text='缴费类型')

5,显示窗口 

# 让控件显示
table.pack() 

6,运行窗口 

# 让窗口运行
window.mainloop()

 控制台运行效果

三,功能完成

1,增加:追加

2,根据下标删除,移除元素,注意不是移除下标

注意:

loads直接指定二进制的数据
load直接读取文件

manager包下recordManager文件,完整代码

  1. import pickle
  2. from pojo.record import Record
  3. class RecordManager:
  4. records: list = []
  5. def __init__(self):
  6. # 初始化后开始加载文件中的数据
  7. with open('record.txt', 'rb') as f:
  8. data = f.read()
  9. if data == b'':
  10. # loads直接指定二进制的数据
  11. self.records = pickle.loads(f)
  12. # print('=======',f.read())
  13. # load直接读取文件
  14. # self.records=pickle.load(f)
  15. def add_record(self, record):
  16. assert isinstance(record, Record)
  17. self.records.append(record)
  18. # remove() 移除元素
  19. # pop() 移除下标
  20. def delete_record(self, record_id: str):
  21. for r in self.records:
  22. assert isinstance(r, Record)
  23. if r.record_id == record_id:
  24. self.records.remove(r)
  25. break
  26. else:
  27. print("没有这个人")
  28. def print_record(self):
  29. for r in self.records:
  30. print(r)
  31. def save_record(self):
  32. with open('record.txt', 'wb') as f:
  33. pickle.dump(self.records, f)
  34. manager = RecordManager()
  35. manager.add_record(Record('10002', '小🐖', 5000, '生育保险'))
  36. manager.add_record(Record('10003', '小🐕', 3000, '失业保险'))
  37. manager.print_record()
  38. manager.save_record()
  39. # Java中
  40. # 序列化:将对象变成文件
  41. # 反序列化:将文件变成对象

控制台运行结果

 1,增加:

from tkinter import simpledialog—–导包

simpledialog.askstring(‘title’,’prompt’)—-提示标题,提示

 2,删除

①获取被选中的行

②获取这行的数据(获取这行的字典对象,获取字典对象的值)

# 获取被选中的行
if len(table.selection())>0:
    # 获取当前这行数据
    # table.item(table.selection()[0])获得字典对象
    # ["values"]获取字典的值
    id=table.item(table.selection()[0])["values"][0]

3,加载

①获取所有的元素

②清空元素

注意:END是一个常量

4,保存

main包下main文件,完整代码

  1. # GUI界面编程
  2. # 界面包
  3. from tkinter import *
  4. from tkinter import simpledialog
  5. from tkinter.ttk import Treeview
  6. from tkinter import messagebox as message
  7. from manager.recordManager import RecordManager
  8. from pojo.record import Record
  9. manager=RecordManager()
  10. # 新建一个窗口
  11. window=Tk()
  12. # 设置标题
  13. window.title('险种管理')
  14. # 设置大小 widthxheightt+x+y
  15. window.geometry('400x400+200+200')
  16. # 增加
  17. def add():
  18. id=simpledialog.askstring('提示','输入编号')
  19. name=simpledialog.askstring('提示','输入名称')
  20. money=simpledialog.askstring('提示','输入金额')
  21. type=simpledialog.askstring('提示','输入类型')
  22. r=Record(id,name,money,type)
  23. manager.add_record(r)
  24. load()
  25. # 删除
  26. def delete():
  27. # message.showinfo('提示','删除成功')
  28. if message.askyesno('提示','是否删除'):
  29. # pass
  30. # 获取被选中的行
  31. if len(table.selection())>0:
  32. # 获取当前这行数据
  33. # table.item(table.selection()[0])获得字典对象
  34. # ["values"]获取字典的值
  35. id=table.item(table.selection()[0])["values"][0]
  36. manager.delete_record(str(id))
  37. table.delete(table.selection()[0])
  38. #加载
  39. def load():
  40. #1.获得所有元素
  41. for i in table.get_children():
  42. # 2.清空元素
  43. print(i)
  44. table.delete(i)
  45. for r in manager.records:
  46. assert isinstance(r,Record)
  47. table.insert('',END,value=(r.record_id,r.record_name,r.record_money,r.record_type))
  48. # END是一个常量
  49. def save():
  50. manager.save_record()
  51. # 编写控件Treeview
  52. table = Treeview(columns=('id','name','money','type'),show='headings')
  53. table.column('id',width=100)
  54. table.column('name',width=100)
  55. table.column('money',width=100)
  56. table.column('type',width=100)
  57. table.heading('id',text='记录编号')
  58. table.heading('name',text='缴费者')
  59. table.heading('money',text='缴费金额')
  60. table.heading('type',text='缴费类型')
  61. # 让控件显示
  62. table.pack()
  63. # command指令。调用方法
  64. Button(text='增加',command=add).pack()
  65. Button(text='删除',command=delete).pack()
  66. Button(text='加载',command=load).pack()
  67. Button(text='保存',command=save).pack()
  68. # 让窗口运行
  69. window.mainloop()

运行效果

点击加载 ,数据显示

 

点击增加

 

 

 

 选中一条数据点击删除

可以删除成功