目录
项目主框架实现
将实验所需初始的背景图片【background.jpg】和OpenCV自带的分类器文件 【haarcascade_frontalface_alt2.xml】,拷贝到当前项目路径下(以实际项目路径为准)。
1. 导入工具库
将项目自动生成文件main.py内容清空,输入以下代码,导入项目所需工库;
import wx
import wx.xrc
import wx.grid
import _thread
import cv2
import json
import sqlite3
import time
import numpy as np
import requests
from PIL import Image
点击右上角运行按钮,运行结果无报错,说明实验环境及第三方工具库部署成功!如图所示。
2. 定义主体框架
定义人脸识别类Face_recognition,继承自wx.Frame类,用于初始化生成前端GUI框架,设置标题为"员工 考勤系统",窗口尺寸为(1000, 700);
定义主函数main(),实例化人脸识别类。代码如下:
import wx
class Face_recognition(wx.Frame):
def init (self):
self.frame = wx.Frame. init (self, parent=None, title="员工考勤系统",
size=(1000, 700))
if __name__=='__main__':
app = wx.App()
frame = Face_recognition(parent=None)
frame.Show()
app.MainLoop()
点击右上角运行按钮,弹出主程序窗口!如图所示。
测试完成后,关闭弹窗!
GUI界面设计
GUI界面的实现,可以使用可视化编辑工具wxFormBuilder实现,也可使用纯代码实现;
1. 员工打卡模块
员工打卡模块设计,主要完成打卡功能,示例如下:
2. 人脸注册模块
人脸注册模块设计,主要完成注册功能,包括【员工id】文本框和【员工姓名】文本框,【确认】按 钮,示例如下:
3. 人脸删除模块
人脸删除模块设计,主要完成删除功能,包括【员工id】文本框,【确认删除】按钮,示例如下:
4. 查看员工打卡信息模块
主要完成信息查询功能,包括【查询】按钮,示例如下:
代码实现如下,在类中的初始化模块,添加初始化菜单代码:
import wx
class Face_recognition(wx.Frame):
def init (self):
self.frame = wx.Frame. init (self, parent=None, title="员工考勤系统",
size=(1000, 700))
self.initMenu() # 此处添加初始化菜单代码
然后在类中实现初始化菜单的方法initMenu() ,将以上4个GUI模块分别实现;
def initMenu(self):
self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)
bSizer1 = wx.BoxSizer(wx.VERTICAL)
self.m_notebook1 = wx.Notebook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0)
self.m_panel1 = wx.Panel(self.m_notebook1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
bSizer2 = wx.BoxSizer(wx.VERTICAL)
self.btnSign = wx.Button(self.m_panel1, wx.ID_ANY, u"打卡", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer2.Add(self.btnSign, 0, wx.ALL, 5)
# 使用wx.Image()添加背景图片
self.imageBackgroud = wx.Image('background.jpg', wx.BITMAP_TYPE_ANY).Scale(500, 400)
# 当id的值为-1或者wx.ID_ANY时,系统会随机分配一个id
self.bmpSign = wx.StaticBitmap(self.m_panel1, wx.ID_ANY, wx.Bitmap(self.imageBackgroud), wx.Point(0, 40))
bSizer2.Add(self.bmpSign, 0, wx.ALL, 5)
self.m_panel1.SetSizer(bSizer2)
self.m_panel1.Layout()
bSizer2.Fit(self.m_panel1)
self.m_notebook1.AddPage(self.m_panel1, u"员工打卡", True)
self.m_panel2 = wx.Panel(self.m_notebook1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
bSizer3 = wx.BoxSizer(wx.VERTICAL)
self.txtRegisterNum = wx.TextCtrl(self.m_panel2, wx.ID_ANY, u"工号", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer3.Add(self.txtRegisterNum, 0, wx.ALL, 5)
self.txtName = wx.TextCtrl(self.m_panel2, wx.ID_ANY, u"姓名", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer3.Add(self.txtName, 0, wx.ALL, 5)
self.btnRegister = wx.Button(self.m_panel2, wx.ID_ANY, u"注册", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer3.Add(self.btnRegister, 0, wx.ALL, 5)
# 使用wx.Image()添加背景图片
self.imageBackgroud1 = wx.Image('background.jpg', wx.BITMAP_TYPE_ANY).Scale(500, 400)
self.bmpRegister = wx.StaticBitmap(self.m_panel2, -1, wx.Bitmap(self.imageBackgroud1), wx.Point(0, 60))
bSizer3.Add(self.bmpRegister, 0, wx.ALL, 5)
self.m_panel2.SetSizer(bSizer3)
self.m_panel2.Layout()
bSizer3.Fit(self.m_panel2)
self.m_notebook1.AddPage(self.m_panel2, u"人脸注册", False)
self.m_panel3 = wx.Panel(self.m_notebook1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
bSizer4 = wx.BoxSizer(wx.VERTICAL)
self.txtDeleteNum = wx.TextCtrl(self.m_panel3, wx.ID_ANY, u"工号", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer4.Add(self.txtDeleteNum, 0, wx.ALL, 5)
self.btnDelete = wx.Button(self.m_panel3, wx.ID_ANY, u"删除", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer4.Add(self.btnDelete, 0, wx.ALL, 5)
self.m_panel3.SetSizer(bSizer4)
self.m_panel3.Layout()
bSizer4.Fit(self.m_panel3)
self.m_notebook1.AddPage(self.m_panel3, u"人脸删除", False)
self.m_panel4 = wx.Panel(self.m_notebook1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
bSizer5 = wx.BoxSizer(wx.VERTICAL)
self.btnSearch = wx.Button(self.m_panel4, wx.ID_ANY, u"查询", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer5.Add(self.btnSearch, 0, wx.ALL, 5)
self.m_panel4.SetSizer(bSizer5)
self.m_panel4.Layout()
bSizer5.Fit(self.m_panel4)
self.m_notebook1.AddPage(self.m_panel4, u"信息查询", False)
bSizer1.Add(self.m_notebook1, 1, wx.EXPAND | wx.ALL, 5)
self.SetSizer(bSizer1)
self.Layout()
self.Centre(wx.BOTH)
# 按钮事件绑定
self.btnSign.Bind(wx.EVT_BUTTON, self.sign_face)
self.btnRegister.Bind(wx.EVT_BUTTON, self.register_face)
self.btnDelete.Bind(wx.EVT_BUTTON, self.delete_face)
self.btnSearch.Bind(wx.EVT_BUTTON, self.search_info)
然后在类中实现,绑定4个GUI模块中按钮的响应函数;
grid = wx.grid.Grid(self, pos=(10, 80), size=(968, 560))
grid.CreateGrid(100, 6)
for i in range(100):
for j in range(6):
grid.SetCellAlignment(i, j, wx.ALIGN_CENTER, wx.ALIGN_CENTER)
grid.SetColLabelValue(0, "工号") # 第一列标签
grid.SetColLabelValue(1, "姓名")
grid.SetColLabelValue(2, "上班打卡时间")
grid.SetColLabelValue(3, "是否迟到")
grid.SetColLabelValue(4, "下班打卡时间")
grid.SetColLabelValue(5, "工作时长(h)")
grid.SetColSize(0, 100)
grid.SetColSize(1, 100)
grid.SetColSize(2, 150)
grid.SetColSize(3, 150)
grid.SetColSize(4, 150)
grid.SetColSize(5, 150)
grid.SetCellTextColour(3, 3, wx.GREEN)
for i, id in enumerate(self.user_id):
grid.SetCellValue(i, 0, str(id))
grid.SetCellValue(i, 1, self.user_name[i])
grid.SetCellValue(i, 2, self.time_1[i])
grid.SetCellValue(i, 3, self.logcat_late[i])
grid.SetCellValue(i, 4, self.time_2[i])
grid.SetCellValue(i, 5, str(self.dur_time[i]))
点击右上角运行按钮,验证结果是否正确,弹出主程序窗口!如图所示。
验证完成后,关闭窗口。
总结
本节课我们学习了项目主框架实现,GUI界面设计的相关内容。下节课我们将学习项目的最后一部分内容。我会带着大家一起完成人脸识别打卡项目的所有内容。