Python桌面开发实战之员工信息管理系统

前言

学无止境,无止境学。大家好,我是张大鹏,之前在抖音有5万多粉丝,不过现在不拍视频,专心写公众号了。笔者目前是高级Python工程师,之前是全栈工程师,主要擅长Golang和Python开发,对于JavaVue,React也有一些研究。工作之余,喜欢学习和分享,希望能够通过此公众号”张大鹏520″,将自己学到的东西分享给大家,和大家一起交流,一起成长,一起进步。

今天要给大家分享的是《Python桌面开发实战之员工信息管理系统》,这是一个非常基础但是功能比较完备的案例。在本教程中,我会带领大家从基础的pickle版本开始讲起,一步一步的实现多pickle版本,面向对象版本以及最终的GUI版本。本套教程参考了《Python编程》第4版上册第一章的内容,感兴趣的同学可以去看看这本好书。

如果大家需要本教程的PDF电子书或者完整的源码,可以在文末找到获取方式哈。

效果预览

为了引起大家的兴趣,先上一波界面效果。

界面效果:

Python桌面开发实战之员工信息管理系统


更新提示:

Python桌面开发实战之员工信息管理系统


查找数据提示:

Python桌面开发实战之员工信息管理系统


单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('张三'4230000'高级Python工程师')
    lisi = Person('李四'4540000'前端工程师')
    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('张三'4230000'高级Python工程师')
lisi = Person('李四'4540000'前端工程师')

# 创建经理
wangwu = Manager('王五'5050000)

# 添加数据
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('张三'4230000'高级Python工程师')
    lisi = Person('李四'4540000'前端工程师')
    print(zhangsan.name, zhangsan.salary)

    # 给李四涨工资
    lisi.give_raise(.10)
    print(lisi.salary)

tkinter程序

界面效果:

Python桌面开发实战之员工信息管理系统


更新提示:

Python桌面开发实战之员工信息管理系统


查找数据提示:

Python桌面开发实战之员工信息管理系统


完整代码:

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!