python:岗位管理正式版2.0

一继续之前的工作

        https://blog.csdn.net/weixin_64622090/article/details/128401427

        已基本满足需求,后续除修改bug一般不再更新

二介绍

本软件作用于人员管理,
1创建一个岗位管理界面,点击岗位管理之后,设置好岗位名称,拖动鼠标画框,完成岗位创建,之后里面可以放置人员。可以将之前建立的岗位删除,同时里面的人员也会删除。
2新增人员,包括(身份信息用不同颜色表示,岗位信息代表处于何种岗位)
3人员可以拖动到任意岗位,岗位也可以拖动到任意位置
4人员信息变更:增加借走,会在名字后增加文字;增加图标,名字前面增加ico图标;增加状态,当不在位时增加颜色形状提示
5统计人员状态,总计/在位/离开人员,并详细说明离开人员去向
6右键点击岗位增加岗位人员统计和大小/颜色更改
7更新花名册:读取.XLSX的花名册
如果花名册里有这些人员,会根据状态进行改变。 根据身份改变颜色/根据状态,暂离的改变背景样式,休假的增加边框提示.
将人员统计信息加入到表格的最下方

三示例

主页面 

 导出的花名册

四主程序代码

其他为UI生成,暂且不表,来信索取

# -*- coding:utf-8 -*-
import ast  # 文本转字典
import os
import sys

from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt, QRect, QMimeData, QDate, QTime
from PyQt5.QtGui import QPainter, QPen, QIcon, QDrag, QColor
from PyQt5.QtWidgets import QMainWindow, QVBoxLayout, QColorDialog, QPushButton, QFileDialog, QInputDialog
from PyQt5.QtWidgets import QWidget, QApplication

from boy_ui_main import Ui_MainWindow  # 导入第一个py,主窗口
from boy_ui_new import Ui_newboy  # 导入第二个py,新增成员窗口
from change_gangwei import Ui_Form  # 导入的第五个py,岗位按键右键的窗口,在岗位button类里实例化
from manager_ui_gangwei import Ui_widget  # 导入第三个py,岗位管理窗口
from openpyexcel import load_workbook, styles  # 修改花名册用
from rightclickfrom import Ui_Rrightclickform  # 导入的第四个py,人员按键右键的窗口,在人员button类里实例化

U = 0  # 控制岗位类拖动


# 主窗口
class MainWindow(QMainWindow, Ui_MainWindow):  # 多重继承QMainWindow和Ui_MainWindow

    def __init__(self):
        super(MainWindow, self).__init__()  # 先调用父类QMainWindow的初始化方法
        self.setupUi(self)  # 再调用setupUi方法
        self.setWindowIcon(QIcon("./icon.ico"))  # 设置程序图标
        self.curren_file_path = None  # 保存打开的文件路径,便于保存
        self.newboyshow = newwindow_anjian()  # 1实例化新建成员窗口1111111111
        self.newgangweishow = newwindow_gangwei()  # 2实例化管理岗位窗口2222222222

        self.add_boy.triggered.connect(self.newshow)  # 为增加人员按钮添加打开新窗口的动作
        self.savenewaction.triggered.connect(lambda: self.savenow(None))  # 为保存增加另保存的动作
        self.saveaction.triggered.connect(lambda: self.savenow(self.curren_file_path))  # 为保存增加另保存的动作
        self.openaction.triggered.connect(self.opennow)  # 为打开增加打开的动作
        self.add_gangwei_huakuang.triggered.connect(self.manager_gangwei)  # 为增加岗位增加管理岗位功能,可以画了
        self.action_zaiwei.triggered.connect(self.zaiweishow)  # 增加在位显示功能
        self.action_EXCEL.triggered.connect(self.daochu)  # 增加导出EXCEL功能

        self.save_data_anjian = dict()  # 需要保存的按键字典
        self.save_data_layout = dict()  # 需要保存的框体字典
        self.save_data_tubiao = dict()  # 需要保存的图标字典 命名=路径
        self.save_data_jiezou = []  # 需要保存的借用物品列表
        self.save_data_zhuangtai = ["在位"]  # 需要保存的状态

        self.setAcceptDrops(True)  # 拖动人员按键用——接受拖拽释放
        self.sig_huakuang = 0  # 画框用,=0时不让画框
        self.x0 = 0  # 画框用
        self.y0 = 0  # 画框用
        self.x1 = 0  # 画框用
        self.y1 = 0  # 画框用
        self.flag = False  # # 画框用,鼠标未按下
        self.move = False  # # 画框用,存在移动
        self.gangwei = 0  # 初始岗位名称
        self.x_move = None  # 拖动岗位框体后的坐标
        self.y_move = None  # 拖动岗位框体后的坐标

    #  1管理岗位页面,在新岗位页面设置完了岗位,点了确定,才能画框1111111111
    def manager_gangwei(self):
        self.newgangweishow.show()

    # 2人员增加和身份管理新窗口的动作222222222222
    def newshow(self):
        self.newboyshow.show()

    def zaiweishow(self):  # 在位状态统计
        num_all = 0
        num_zai = 0
        zhuangtai = []  # 所有状态列表
        for shuxing in self.save_data_anjian.values():
            num_all += 1
            zhuangtai.append(shuxing[4])
            if shuxing[4] == "在位":
                num_zai += 1
        dict_zhuangtai = {}
        for i in self.save_data_zhuangtai:
            dict_zhuangtai[i] = zhuangtai.count(i)
        QtWidgets.QMessageBox.information(self, "在位状态",
                                          f"总人数{num_all},在位人数{num_zai},暂离人数{num_all - num_zai},\
                                          \n{list(dict_zhuangtai.items())}")

    #  画框用第一步---单击鼠标触发事件,初始左上角的点
    def mousePressEvent(self, event):
        self.x0 = event.pos().x()
        self.y0 = event.pos().y()
        self.flag = True

    # 画框用第二步--鼠标跟踪,获取x,y
    def mouseMoveEvent(self, event):
        self.move = True
        if self.flag:
            self.x1 = event.pos().x()
            self.y1 = event.pos().y()
            self.update()  # 触发paintEvent()

    # 画框用第三步,只要拖动就会一直绘制事件
    def paintEvent(self, event):
        super().paintEvent(event)
        painter = QPainter(self)  # 拖动时候的临时框
        if self.sig_huakuang == 1:  # 若画岗位,鼠标变形
            self.setCursor(Qt.CrossCursor)
        for rec in self.save_data_layout.values():  # 遍历所有的框体,一直画
            painter.setPen(QPen(QColor(rec[4]), 2, Qt.SolidLine))  # 画笔设置,每个框不一样,rec[4]为画笔颜色
            painter.drawRect(QRect(rec[0], rec[1], rec[2], rec[3]))
        if self.flag and self.move and self.sig_huakuang == 1:  # 只有当鼠标按下并且移动状态,还没选中岗位,画临时框

            rect = QRect(self.x0, self.y0, abs(self.x1 - self.x0), abs(self.y1 - self.y0))
            painter.setPen(QPen(Qt.red, 2, Qt.SolidLine))
            painter.drawRect(rect)

    # 画框用第四步--鼠标释放事件,清零,并且不再绘制,self.sig_huakuang=0
    def mouseReleaseEvent(self, event):
        self.unsetCursor()  # 取消鼠标样式
        global U  # 画框控制信号
        self.flag = False  # 不再按下
        self.move = False  # 不再移动
        self.x_move = event.pos().x()  # 拖动岗位类的最终位置
        self.y_move = event.pos().y()  # 拖动岗位类的最终位置
        # 释放鼠标时储存
        if self.x1 and self.y1 and self.sig_huakuang == 1:  # 不移动按了没用,也就是有宽度和高度时
            print("鼠标放下")
            self.unsetCursor()  # 取消鼠标变形
            gangwei = self.gangwei  # 框体的临时名称
            rec = self.x0, self.y0, abs(self.x1 - self.x0), abs(self.y1 - self.y0), Qt.black  # 位置和大小,和颜色
            self.save_data_layout[gangwei] = rec  # 保存这个框体的数据
            # print("rec",rec,self.x1,self.y1)
            # 同时建立一个布局和一个按钮显示布局信息
            self.draw_rect(gangwei, rec)  # 执行创建岗位命令
            self.sig_huakuang = 0  # 使其不能再画

        # 如果按了岗位按键Y and,并且现在不让画框,并且按了左键拖动了:那么移动岗位和布局控件,修改存储的数据,button.Y=目前的岗位框
        if self.sig_huakuang &
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值