前言
学无止境,无止境学。大家好,我是张大鹏,之前在抖音有5万多粉丝,不过现在不拍视频,专心写公众号了。笔者目前是高级Python工程师,之前是全栈工程师,主要擅长Golang和Python开发,对于Java,Vue,React也有一些研究。工作之余,喜欢学习和分享,希望能够通过此公众号”张大鹏520″,将自己学到的东西分享给大家,和大家一起交流,一起成长,一起进步。
今天要给大家分享的是《Python桌面开发实战之员工信息管理系统》,这是一个非常基础但是功能比较完备的案例。在本教程中,我会带领大家从基础的pickle版本开始讲起,一步一步的实现多pickle版本,面向对象版本以及最终的GUI版本。本套教程参考了《Python编程》第4版上册第一章的内容,感兴趣的同学可以去看看这本好书。
如果大家需要本教程的PDF电子书或者完整的源码,可以在文末找到获取方式哈。
效果预览
为了引起大家的兴趣,先上一波界面效果。
界面效果:
更新提示:
查找数据提示:
单pickle版本
测试数据
# 指定数据
zhangsan = {'name': '张三', 'age': 42, 'salary': 30000, 'job': '高级Python工程师'}
lisi = {'name': '李四', 'age': 45, 'salary': 40000, 'job': 'Java后端工程师'}
wangwu = {'name': '王五', 'age': 50, 'salary': 0, 'job': None}
# 模拟数据库
db = {}
db['zhangsan'] = zhangsan
db['lisi'] = lisi
db['wangwu'] = wangwu
if __name__ == '__main__':
# 遍历数据
for key in db:
print(key, '=>n ', db[key])
保存数据
import pickle
from initdata import db
# 使用二进制类型的文件
dbfile = open('tmp/people-pickle', 'wb')
# 保存数据
pickle.dump(db, dbfile)
# 关闭文件流
dbfile.close()
查找数据
import pickle
# 打开数据库文件
dbfile = open('tmp/people-pickle', 'rb')
# 加载数据库,实际上是还原为Python中列表嵌套字典的结构
db = pickle.load(dbfile)
# 遍历列表
for key in db:
print(key, '=>n ', db[key])
# 直接访问
print(db['zhangsan']['name'])
更新数据
import pickle
# 数据库名字
db_file = "tmp/people-pickle"
# 打开数据库文件
dbfile = open(db_file, 'rb')
# 加载数据库
db = pickle.load(dbfile)
dbfile.close()
# 修改值
db['zhangsan']['salary'] *= 1.10
db['lisi']['name'] = '李四123'
# 重新打开文件
dbfile = open(db_file, 'wb')
# 保存修改后的数据
pickle.dump(db, dbfile)
dbfile.close()
多pickle版本
测试数据
# 指定数据
zhangsan = {'name': '张三', 'age': 42, 'salary': 30000, 'job': '高级Python工程师'}
lisi = {'name': '李四', 'age': 45, 'salary': 40000, 'job': 'Java后端工程师'}
wangwu = {'name': '王五', 'age': 50, 'salary': 0, 'job': None}
# 模拟数据库
db = {}
db['zhangsan'] = zhangsan
db['lisi'] = lisi
db['wangwu'] = wangwu
if __name__ == '__main__':
# 遍历数据
for key in db:
print(key, '=>n ', db[key])
保存数据
import pickle
from initdata import zhangsan, lisi, wangwu
# 每条数据分别保存一个pickle
for (key, record) in [('zhangsan', zhangsan), ('lisi', lisi), ('wangwu', wangwu)]:
# 创建数据库
recfile = open('../tmp/' + key + '.pkl', 'wb')
# 保存数据
pickle.dump(record, recfile)
# 关闭文件
recfile.close()
更新数据
import pickle
db_file = '../tmp/zhangsan.pkl'
# 打开单个数据库文件
zhangsanfile = open(db_file, 'rb')
# 加载数据
zhangsan = pickle.load(zhangsanfile)
zhangsanfile.close()
# 修改数据
zhangsan['salary'] *= 1.10
# 重新打开数据库文件
suefile = open(db_file, 'wb')
# 保存
pickle.dump(zhangsan, suefile)
suefile.close()
查找数据
import glob
import pickle
# 遍历所有的pkl文件
for filename in glob.glob('../tmp/*.pkl'):
# 打开文件
recfile = open(filename, 'rb')
# 加载数据
record = pickle.load(recfile)
# 查看记录
print(filename, '=>n ', record)
# 单独打开一个文件
zhangsanfile = open('../tmp/zhangsan.pkl', 'rb')
print(pickle.load(zhangsanfile)['name'])
shelve版本
测试数据
# 指定数据
zhangsan = {'name': '张三', 'age': 42, 'salary': 30000, 'job': '高级Python工程师'}
lisi = {'name': '李四', 'age': 45, 'salary': 40000, 'job': 'Java后端工程师'}
wangwu = {'name': '王五', 'age': 50, 'salary': 0, 'job': None}
# 模拟数据库
db = {}
db['zhangsan'] = zhangsan
db['lisi'] = lisi
db['wangwu'] = wangwu
if __name__ == '__main__':
# 遍历数据
for key in db:
print(key, '=>n ', db[key])
保存数据
import shelve
from initdata import zhangsan, lisi, wangwu
# shelve是pickle的上层封装
# 使用shelve,我们可以像操作字典一样操作pickle,且效率和多文件pickle一样高
# 也就是说,shelve不需要每次都加载整个数据库
# 创建数据库
db = shelve.open('../tmp/people-shelve')
# 保存数据
db['zhangsan'] = zhangsan
db['lisi'] = lisi
db['wangwu'] = wangwu
# 关闭数据库
# 关闭时,会自动将所有数据持久化到文件中
db.close()
更新数据
import shelve
from initdata import zhangsan
db = shelve.open('../tmp/people-shelve')
# 取出单条数据并修改
lisi = db['lisi']
lisi['salary'] *= 1.50
# 重新赋值
db['lisi'] = lisi
# 添加一条新的数据
db['zhangsan2'] = zhangsan
# 关闭时自动保存
db.close()
查找数据
import shelve
# 打开数据库文件
db = shelve.open('../tmp/people-shelve')
# 查看数据
for key in db:
print(key, '=>n ', db[key])
# 单独查看数据
print(db['zhangsan']['name'])
# 使用完关闭
db.close()
面向对象版本
员工类
class Person:
def __init__(self, name, age, salary=0, job=None):
self.name = name
self.age = age
self.salary = salary
self.job = job
def give_raise(self, percent):
"""
涨工资
"""
self.salary *= (1.0 + percent)
if __name__ == '__main__':
# 创建两个员工
zhangsan = Person('张三', 42, 30000, '高级Python工程师')
lisi = Person('李四', 45, 40000, '前端工程师')
print(zhangsan.name, zhangsan.salary)
# 给李四涨工资
lisi.give_raise(.10)
print(lisi.salary)
经理类
from person import Person
class Manager(Person):
def give_raise(self, percent, bonus=0.1):
"""
涨工资
"""
self.salary *= (1.0 + percent + bonus)
if __name__ == '__main__':
wangwu = Manager(name='王五', age=50, salary=50000)
print(wangwu.name)
wangwu.give_raise(.20)
print(wangwu.salary)
保存数据
import shelve
from manager import Manager
from person import Person
# 创建员工
zhangsan = Person('张三', 42, 30000, '高级Python工程师')
lisi = Person('李四', 45, 40000, '前端工程师')
# 创建经理
wangwu = Manager('王五', 50, 50000)
# 添加数据
db = shelve.open('../tmp/class-shelve')
db['zhangsan'] = zhangsan
db['lisi'] = lisi
db['wangwu'] = wangwu
# 持久化保存数据
db.close()
修改数据
import shelve
db = shelve.open('../tmp/class-shelve')
# 提取数据
zhangsan = db['zhangsan']
# 涨工资
zhangsan.give_raise(.25)
# 修改数据
db['zhangsan'] = zhangsan
# 给经理涨工资
wangwu = db['wangwu']
wangwu.give_raise(.20)
db['wangwu'] = wangwu
# 保存修改
db.close()
查找数据
import shelve
db = shelve.open('../tmp/class-shelve')
# 查看所有数据
for key in db:
print(key, '=>n ', db[key].name, db[key].salary)
# 查看张三的数据
zhangsan = db['zhangsan']
print(zhangsan.salary)
# 查看王五的数据
print(db['wangwu'].salary)
GUI版本
Person类
class Person:
def __init__(self, name, age, salary=0, job=None):
self.name = name
self.age = age
self.salary = salary
self.job = job
def give_raise(self, percent):
"""
涨工资
"""
self.salary *= (1.0 + percent)
if __name__ == '__main__':
# 创建两个员工
zhangsan = Person('张三', 42, 30000, '高级Python工程师')
lisi = Person('李四', 45, 40000, '前端工程师')
print(zhangsan.name, zhangsan.salary)
# 给李四涨工资
lisi.give_raise(.10)
print(lisi.salary)
tkinter程序
界面效果:
更新提示:
查找数据提示:
完整代码:
import shelve
from tkinter import *
from tkinter.messagebox import showerror, showinfo
from person import Person
# 数据库文件名
shelve_name = '../tmp/class-shelve'
# 字段名
field_list = ('姓名', '年龄', '职业', '工资')
field_value_list = ('name', 'age', 'job', 'salary')
field_dict = {
'姓名': 'name',
'年龄': 'age',
'职业': 'job',
'工资': 'salary'
}
# 表单项列表
# 存放的是临时的一组表单项数据:{表名项名:表单项实体}
entries = {}
def make_widgets():
"""
创建组件
"""
global entries
# 创建窗口
window = Tk()
# 设置标题
window.title('员工管理系统')
# 设置表单
form = Frame(window)
form.pack()
# 设置表单项
for (ix, label) in enumerate(('ID',) + tuple(field_dict.keys())):
# 提示文本
lab = Label(form, text=label)
# 输入框
ent = Entry(form)
# 设置布局
lab.grid(row=ix, column=0)
ent.grid(row=ix, column=1)
# 追加到表单字典
if label == "ID":
entries["ID"] = ent
else:
entries[field_dict.get(label)] = ent
print(entries)
# 创建按钮
Button(window, text="查找", command=fetch_record).pack(side=LEFT)
Button(window, text="更新", command=update_record).pack(side=LEFT)
Button(window, text="退出", command=window.quit).pack(side=RIGHT)
# 返回窗口
return window
def fetch_record():
"""
查询记录
"""
# 先清空原本的内容
clear_entries()
# 获取每个字段的值
pid = str(entries["ID"].get()).replace(""", "").replace("'", "").strip()
print(f"entries = {entries}")
try:
# 从数据库查询记录
record = db[pid]
except:
# 异常
showerror(title='出错了', message=f'查不到这条数据:{pid}')
else:
# 添加数据
for field in field_dict.values():
# 清空原本的内容
entries[field].delete(0, END)
# 插入新的内容
entries[field].insert(0, repr(getattr(record, field)))
def clear_entries():
for field in field_dict.values():
entries[field].delete(0, END)
def update_record():
"""
更新记录
"""
pid = str(entries["ID"].get()).replace(""", "").replace("'", "").strip()
print(f"entries = {entries}")
# 更新数据库的记录
if pid in db:
record = db[pid]
# 将属性设置到记录中
name = str(entries["name"].get()).replace(""", "").replace("'", "").strip()
age = entries["age"].get()
try:
if age == "":
age = 0
else:
age = int(age)
except:
showerror(title='出错了', message=f'年龄必须是整数类型')
salary = entries["salary"].get()
try:
if salary == "":
salary = 0
else:
salary = float(salary)
except:
showerror(title='出错了', message=f'薪资必须是整数或者小数类型')
job = str(entries["job"].get()).replace(""", "").replace("'", "").strip()
print("ID", pid)
print("姓名:", name)
print("年龄:", age)
print("薪资:", salary)
print("职业:", job)
record = Person(name, age, salary, job)
# 保存记录
db[pid] = record
# 提示消息
showinfo(title='提示', message='数据更新成功')
# 创建数据库
db = shelve.open(shelve_name)
# 创建窗口
window = make_widgets()
# 启动窗口循环
window.mainloop()
# 关闭窗口时保存数据库
db.close()
结语
关注我不迷路,欢迎关注我的微信公众号”张大鹏520″,如果您对此文章感兴趣,欢迎点赞收藏,留言评论。
文中所有代码,只需要打赏3元,然后留言评论“已打赏”,即可获取哦。
写文章不容易,不喜勿喷哈,如果有想要学编程,学项目,或者在工作中有项目难以单独完成需要提供帮助的同学,欢迎私信我哈。生活不易,想要利用学到的编程知识,业余赚点零花钱。
接项目:网站开发,APP开发,各种管理系统开发。
带徒弟:Python编程教学,Golang编程教学,前端编程教学。
谢谢您!!!
原文始发于微信公众号(张大鹏520):Python桌面开发实战之员工信息管理系统
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/48627.html