我是靠谱客的博主 负责抽屉,最近开发中收集的这篇文章主要介绍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 and U:
            ganwgei = self.focusWidget().text()  # 从按键名字提取岗位信息
            self.__dict__["pushButton" + ganwgei].move(self.x_move, self.y_move - 55)  # 55,修改个位置
            self.__dict__["gridLayoutWidget" + ganwgei].move(self.x_move, self.y_move - 20)
            # 更改数据信息
            # print(type(self.save_data_layout[ganwgei]))   <class 'tuple'> 单个值没法修改
            xx = self.save_data_layout[ganwgei][2]  # 只能更改字典值
            yy = self.save_data_layout[ganwgei][3]  # 只能更改字典值
            color = self.save_data_layout[ganwgei][4]
            self.save_data_layout[ganwgei] = (self.x_move, self.y_move, xx, yy, color)  # 保存新的岗位信息

            U = 0  # 设置完了就不能动了,除非再点按钮
            self.update()  # 刷新画面,去掉之前的,并触发新的画画事件
        self.x0, self.y0, self.x1, self.y1 = (0, 0, 0, 0)  # 鼠标重新设置

    # 画框体、按键、和布局.打开文件和创建时候用。同时增加人员岗位可选项
    def draw_rect(self, gangwei, rec):
        self.__dict__["gridLayoutWidget" + gangwei] = QWidget(self.centralwidget)  # 布局要放到个容器里
        self.__dict__["gridLayoutWidget" + gangwei].setGeometry(QRect(rec[0], rec[1] - 20, rec[2], rec[3] + 5))  # 容器大小
        self.__dict__["layout" + gangwei] = QVBoxLayout()  # 做个垂直布局
        self.__dict__["layout" + gangwei].setSpacing(1)
        self.__dict__["layout" + gangwei].setContentsMargins(0, 0, 0, 0)  # 左上右下不留缝隙
        self.__dict__["gridLayoutWidget" + gangwei].setLayout(self.__dict__["layout" + gangwei])  # 容器使用这个垂直布局
        self.__dict__["gridLayoutWidget" + gangwei].show()  # 容器要显示,少了这个麻烦了

        # 按钮显示 同宽,往上50像素,高30像素
        rectanjian = QRect(rec[0], rec[1] - 55, rec[2], 30)
        self.__dict__["pushButton" + gangwei] = Buttongangwei(self.centralwidget, gangwei, rec[4], rectanjian)
        self.__dict__["pushButton" + gangwei].show()  # 按键显示

        # 增加了岗位,人员可以选
        self.newboyshow.comboBox.addItems([gangwei])
        # 增加了可以删除的岗位
        self.newgangweishow.comboBox.addItems([gangwei])

    def savenow(self, file_path):  # 保存的动作
        try:
            if file_path:  # 如果选的是保存并且之前打开过
                save_file_path = file_path
            else:  # 如果没打开新的,但是点了保存,或者点了另存
                save_file_path1 = QFileDialog.getExistingDirectory(caption="选择要保存的文件夹")  # 选择的路径
                if save_file_path1:  # 点了确定表示要创建
                    data_now = QDate.currentDate()  # 获取日期
                    time_now = QTime.currentTime()  # 获取时间PyQt5.QtCore.QTime(21, 16, 55, 968)
                    timenow = time_now.toString().replace(":", "_")  # time_now.toString()=21:17:16,文件路径不能有:所以21_17_16
                    os.mkdir(f"{save_file_path1}/{data_now.toString(Qt.ISODate)}日{timenow}")  # 创建一个带有日期和时间的文件夹
                    save_file_path = f"{save_file_path1}/{data_now.toString(Qt.ISODate)}日{timenow}"  # 取得设置的文件夹路径F:/pythonvenu/boy/2023-01-04日21_21_34
            file1 = open(f"{save_file_path}/boysavedata_anjian.txt", "w")  # 保存人员按键
            file1.write(str(self.save_data_anjian))
            print("写入成功按键", self.save_data_anjian)
            file1.close()

            file2 = open(f"{save_file_path}/boysavedata_shenfen.txt", "w")  # 保存身份和颜色
            file2.write(str(self.newboyshow.save_data_shenfen))
            print("写入身份按键", self.newboyshow.save_data_shenfen)
            file2.close()

            file3 = open(f"{save_file_path}/boysavedata_layout.txt", "w")  # 保存岗位框
            file3.write(str(self.save_data_layout))
            print("写入成功岗位", self.save_data_layout)
            file3.close()

            file4 = open(f"{save_file_path}/boysavedata_tubiao.txt", "w")  # 保存图标
            file4.write(str(self.save_data_tubiao))
            print("写入图标", self.save_data_tubiao)
            file4.close()

            file5 = open(f"{save_file_path}/boysavedata_jiezou.txt", "w")  # 保存借走
            file5.write(str(self.save_data_jiezou))
            print("写入借走", self.save_data_jiezou)
            file5.close()

            file6 = open(f"{save_file_path}/boysavedata_zhuangtai.txt", "w")  # 保存状态
            file6.write(str(self.save_data_zhuangtai))
            print("写入状态", self.save_data_zhuangtai)
            file6.close()
        except:  # 打开文件异常
            QtWidgets.QMessageBox.information(self, "文件保存异常", "寻找正确的文件路径")

    def opennow(self):  # 打开之前保存的数据
        try:  # 尝试,万一打错了文件路径
            open_file_path = QFileDialog.getExistingDirectory()
            self.curren_file_path = open_file_path
            print("打开了", self.curren_file_path)
            f = open(f"{open_file_path}/boysavedata_layout.txt", "r")  # 尝试打开试试会不会报错
            f.close()
            # 1读取岗位信息并归类增加
            with open(f"{open_file_path}/boysavedata_layout.txt", "r") as file1:
                # print(file1.read())多加这一句话,捯饬半天,read以后就没了,再读就是空的,所以底下会报错
                self.save_data_layout = ast.literal_eval(file1.read())  # 将读取的字符串转为字典
                print("岗位信息", self.save_data_layout)
            for gangwei, rec in self.save_data_layout.items():  # 提取名字和方块
                self.draw_rect(gangwei, rec)  # 执行创建岗位命令

            # 2读取身份和颜色对应信息
            with open(f"{open_file_path}/boysavedata_shenfen.txt", "r") as file:
                self.newboyshow.save_data_shenfen = ast.literal_eval(file.read())  # 将读取的字符串转为字典
                print("身份信息", self.newboyshow.save_data_shenfen)
            self.newboyshow.comboBox_2.addItems(self.newboyshow.save_data_shenfen.keys())  # 增加到身份选择框
            self.newboyshow.comboBox_3.addItems(self.newboyshow.save_data_shenfen.keys())  # 增加到身份删除框

            # 3读取图标信息
            with open(f"{open_file_path}/boysavedata_tubiao.txt", "r") as file:
                self.save_data_tubiao = ast.literal_eval(file.read())  # 将读取的字符串转为字典
                print("图标信息", self.save_data_tubiao)
            # 4读取借走列表
            with open(f"{open_file_path}/boysavedata_jiezou.txt", "r") as file:
                self.save_data_jiezou = ast.literal_eval(file.read())  # 将读取的字符串转为字典
                print("借走信息", self.save_data_jiezou)
            # 5读取状态列表
            with open(f"{open_file_path}/boysavedata_zhuangtai.txt", "r") as file:
                self.save_data_zhuangtai = ast.literal_eval(file.read())  # 将读取的字符串转为字典
                print("状态信息", self.save_data_zhuangtai)

            # 6读取按键信息并归类增加
            with open(f"{open_file_path}/boysavedata_anjian.txt", "r") as file:
                self.save_data_anjian = ast.literal_eval(file.read())  # 将读取的字符串转为字典
                print("按键信息", self.save_data_anjian)
            for name, shuxing in self.save_data_anjian.items():  # 提取名字和属性,属性0为身份,属性1为岗位,2=jiezou,3=tubiao
                self.setpushbutton(name, shuxing)  # 按键加入到岗位
            # self.paintEvent(event=None) #调用画图事件,输入一个空的事件,让他画图
            self.showMaximized()  # 直接最大化,触发画图事件
        except:  # 打开文件异常
            QtWidgets.QMessageBox.information(self, "文件打开异常", "寻找正确的文件路径")

    def daochu(self):
        try:  # 尝试,万一打错了文件路径
            # QFileDialog.getOpenFileName返回的是一个元组,该元组存贮你选择的文件的绝对路径,和该文件的文件类型。
            filename = QFileDialog.getOpenFileName(self, "选取文件-只能是xlsx", "./data", "Excel Files ( *.xlsx)")[0]
            print(filename)
            wb = load_workbook(f"{filename}")
            ws = wb.active
            dict1 = self.save_data_anjian
            dict2 = self.newboyshow.save_data_shenfen
            for row in ws.rows:
                for cell in row:
                    for name, shuxing in dict1.items():
                        if cell.value == name:
                            # 根据身份设置颜色
                            c = "#%06X" % (0xFFFFFF ^ int(dict2[shuxing[0]][1:], 16))
                            fontc_color = c[1:7:1]
                            cell.fill = styles.PatternFill(start_color=dict2[shuxing[0]][1:7:1], fill_type="solid")
                            cell.font = styles.Font(color=fontc_color)
                            # 设置状态
                            if shuxing[4] != "在位":  # 不在位的背景改变
                                cell.fill = styles.PatternFill(start_color=dict2[shuxing[0]][1:7:1],
                                                               fill_type="gray125")
                                if shuxing[4] == "休假":  # 休假的额外加上边框
                                    border = styles.Border(
                                        left=styles.Side(style="medium", color=styles.Color(index=33)),
                                        right=styles.Side(style="medium", color=styles.Color(index=33)),
                                        top=styles.Side(style="medium", color=styles.Color(index=33)),
                                        bottom=styles.Side(style="medium", color=styles.Color(index=33)))

                                    cell.border = border
            # 增加一个统计表
            # wb.create_sheet("统计")
            # ws=wb["统计"]
            # 计算人员状态
            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
            max_row = ws.max_row + 1
            ws.cell(row=max_row, column=1, value="共计")
            ws.cell(row=max_row, column=2, value=f"{num_all}")
            ws.cell(row=max_row, column=3, value="在位")
            ws.cell(row=max_row, column=4, value=f"{num_zai}")
            ws.cell(row=max_row, column=5, value="暂离")
            ws.cell(row=max_row, column=6, value=f"{num_all - num_zai}")
            dict_zhuangtai = {}
            col = 1  # 第二行的列
            for i in self.save_data_zhuangtai:
                dict_zhuangtai[i] = zhuangtai.count(i)
                ws.cell(row=max_row + 2, column=col, value=f"{i}")
                ws.cell(row=max_row + 2, column=col + 1, value=f"{dict_zhuangtai[i]}")
                col += 2

            text, ok = QInputDialog.getText(self, '保存的文件名字', '保存的文件名:')
            if ok:
                path = os.path.dirname(filename)
                wb.save(f"{path}/{text}.xlsx")
        except:  # 打开文件异常
            QtWidgets.QMessageBox.information(self, "文件打开异常", "寻找正确的文件路径")

    # 通过名字和属性建立人员按键并归位,
    def setpushbutton(self, name, shuxing):
        # 点击确定后新增按键,实例化按键,shuxing[0]=身份,shuxing[1]=岗位,2=jiezou,3=tubiao,4=zaiwei
        # print(shuxing)
        buttonnew = Button(name, ui, shuxing[1])  # 点击确定后新增按键,实例化按键,shuxing[0]=身份

        for shenfen, color in self.newboyshow.save_data_shenfen.items():  # 取得身份和color颜色
            if shenfen == shuxing[0]:  # 如果身份对上,增加颜色.font-weight:bold;加粗,color:#FF7F00;font-size:30px;
                font_color = "#%06X" % (0xFFFFFF ^ int(color[1:], 16))  # 取得对比度最高的颜色
                backgroundcolor = "{color:" + f"{font_color}" + ";font-weight:bold;background:" + f"{color}" + ";border-radius:5px;}QPushButton:hover{background:yellow;}'''"  # 两层中括号
                buttonnew.setStyleSheet(f"""QPushButton{backgroundcolor}""")  # 两层中括号需要两次使用
                buttonnew.setMinimumHeight(25)  # 设置最小高度

        # 增加借走
        # 借走;如果没借,不多显示
        if shuxing[2] == None:  # 如果是新建,pass,后面是读取
            pass
        elif shuxing[2] == "无":
            buttonnew.setText(buttonnew.name)
        else:
            if shuxing[2] in ui.save_data_jiezou:
                buttonnew.setText(buttonnew.name + "--" + str(shuxing[2]))  # 否则显示借阅
        # 图标
        if shuxing[3] == None:  # 如果是新建,pass,后面是读取时执行
            pass
        elif shuxing[3] == "无":
            buttonnew.setIcon(QIcon())
        else:
            if shuxing[3] in ui.save_data_tubiao.keys():
                buttonnew.setIcon(QIcon(ui.save_data_tubiao[shuxing[3]]))  # 增加图标
            # self.current_anjian.setIcon(QApplication.style().standardIcon(13))#增加系统自带的ICON类图标
        # 在位
        # 当前按键颜色
        color_now = ui.newboyshow.save_data_shenfen[ui.save_data_anjian[name][0]]  # 0是颜色1是字体
        annother_color = "#%06X" % (0xFFFFFF ^ int(color_now[1:], 16))  # 取得对比度最高的颜色
        # 在位状态,如果不在位,改变其颜色
        if shuxing[4] != "在位":
            # 设置渐变色font-size:30px;
            color = f"qlineargradient(sprea:repeat,x1:0,y1:0,x2:1,y2:1,stop:0 {annother_color},stop:0.5 {color_now})"
            backgroundcolor = "{font-weight:bold;color:" + f"{annother_color}" + ";background:" + f"{color}" + ";border-radius:10px;}QPushButton:hover{background:yellow;}'''"  # 两层中括号
            buttonnew.setStyleSheet(f"""QPushButton{backgroundcolor}""")  # 两层中括号需要两次使用

        buttonnew.show()  # 按键显示出来
        out_rect = 1  # 若未设置岗位
        for gangwei in self.save_data_layout.keys():
            if gangwei == shuxing[1]:
                out_rect = 0  # 有了岗位
                self.__dict__["layout" + gangwei].addWidget(buttonnew)  # 放置到新岗位
        if out_rect:  # 若无岗位
            buttonnew.move(shuxing[1][0], shuxing[1][1])  # 移动到这个位置

    def dragEnterEvent(self, e):  # 鼠标出了按键

        e.accept()

    # 定义了按钮按下后和释放后的行为,
    # 获得鼠标移动的位置,然后把人员按键放到这个地方,修改自身岗位并且保存下来
    def dropEvent(self, e):
        self.unsetCursor()
        position = e.pos()
        current_button: MainWindow = self.focusWidget()  # 设置当前的按键
        out_rect = 1  # 没有找到rect时
        for gangwei, rec in self.save_data_layout.items():
            if position in QRect(rec[0], rec[1], rec[2], rec[3]):
                current_button.gangwei = gangwei  # 设置新岗位
                out_rect = 0  # 找到了rect
                self.save_data_anjian[current_button.name][1] = gangwei  # 保存新岗位
                self.__dict__["layout" + gangwei].addWidget(current_button)  # current_button拖动按键的本身,放置到新岗位
                # 指定放下的动作类型为moveAction

        if out_rect:  # 若无岗位
            current_button.setParent(self.centralwidget)  # 父对象设为中心窗口
            current_button.move(position)  # 移动
            self.save_data_anjian[current_button.name][1] = position.x(), position.y()  # 保存新岗位
            current_button.show()  # 按钮显示


# 增加人员和身份管理的新窗口
class newwindow_anjian(QWidget, Ui_newboy):

    def __init__(self):
        super(newwindow_anjian, self).__init__()
        self.setupUi(self)
        self.shenfen = None  # 新增身份
        self.color = "#FFFFFF"  # 身份对应的颜色
        self.save_data_shenfen = {}

    def add_color(self):  # 身份的颜色
        self.color = QColorDialog.getColor(Qt.green).name()  # 颜色选择画面,选择后按键的颜色
        print(self.color)  # 00aaff   str
        font_color = "#%06X" % (0xFFFFFF ^ int(self.color[1:], 16))  # 取得对比度最高的颜色
        backgroundcolor = "{color:" + f"{font_color}" + ";background:" + f"{self.color}" + ";border-radius:5px;}"  # 两层中括号
        self.pushButton_3.setStyleSheet(f"""QPushButton{backgroundcolor}""")

    def add_shenfen(self):
        self.shenfen = self.lineEdit_shefen.text()  # 获取身份
        self.comboBox_2.addItems([self.shenfen])  # 身份选择里增加新身份
        # print(self.color.name)
        self.save_data_shenfen[self.shenfen] = self.color  # 身份和颜色对应保存
        self.comboBox_3.addItems([self.shenfen])

    def del_shenfen(self):
        tex = self.comboBox_3.currentText()  # 要删除的身份
        del self.save_data_shenfen[tex]  # 从保存的数据里删除
        self.comboBox_2.clear()  # 增加身份菜单清空
        self.comboBox_2.addItems(self.save_data_shenfen.keys())  # 人员增加菜单重新加载身份
        self.comboBox_3.clear()  # 删除身份菜单清空
        self.comboBox_3.addItems(self.save_data_shenfen.keys())  # 删除菜单重新加载身份

    def addok(self):  # 增加完人员,选择确定时候
        # global name,shenfen
        name = self.lineEdit.text()
        shenfen = self.comboBox_2.currentText()
        zhiwu = self.comboBox.currentText()
        jiezou = None
        tubiao = None
        zhuangtai = "在位"
        shuxing = [shenfen, zhiwu, jiezou, tubiao, zhuangtai]
        ui.save_data_anjian[name] = shuxing
        ui.setpushbutton(name, shuxing)  # 输入名字和身份,建立按键


# 管理岗位的新窗口
class newwindow_gangwei(QWidget, Ui_widget):
    def __init__(self):
        super(newwindow_gangwei, self).__init__()
        self.setupUi(self)

    def del_gangwei_ok(self):  # 删除岗位的按键动作
        tex = self.comboBox.currentText()  # 要删除的岗位
        # 让这个三个不显示
        ui.__dict__["gridLayoutWidget" + tex].deleteLater()
        ui.__dict__["layout" + tex].deleteLater()
        ui.__dict__["pushButton" + tex].deleteLater()
        # 让这三个不存在
        del ui.__dict__["gridLayoutWidget" + tex]
        del ui.__dict__["layout" + tex]
        del ui.__dict__["pushButton" + tex]
        del ui.save_data_layout[tex]  # 删掉一个岗位
        self.comboBox.clear()  # 清除删除岗位的下拉菜单
        self.comboBox.addItems(ui.save_data_layout.keys())  # 重新加载岗位
        ui.newboyshow.comboBox.clear()  # 人员增加岗位菜单清空
        ui.newboyshow.comboBox.addItems(ui.save_data_layout.keys())  # 重新加载岗位

        self.close()  # 关闭本身窗口

    def add_gangwei_ok(self):  # 增加岗位的按键
        ui.sig_huakuang = 1  # 增加岗位后才能画岗位
        ui.gangwei = self.lineEdit.text()  # 增加的岗位的名字
        self.close()  # 关闭


# 改变岗位的新窗口
class newwindow_change_gangwei(QWidget, Ui_Form):
    def __init__(self, name, anjian):
        super(newwindow_change_gangwei, self).__init__()

        self.color = "#00aaff"
        self.setupUi(self)
        self.anjian = anjian
        self.buttunname = name  # 导入按键名字
        self.lineEdit_wid.setText(str(ui.save_data_layout[name][2]))  # 设置目前的宽度和高度
        self.lineEdit_hig.setText(str(ui.save_data_layout[name][3]))

    def tongji(self):
        num = 0
        print(self.buttunname)
        for i in ui.save_data_anjian.values():  # 遍历岗位求数量
            if i[1] == self.buttunname:
                num += 1

        self.label_3.setText(f"{self.buttunname}共计{num}人")

    def change_gangwei_color(self):
        # 颜色选择画面,选择后按键的颜色
        self.color = QColorDialog.getColor().name()
        # print(self.color.name())#00aaff   str
        backgroundcolor = "{background:" + f"{self.color}" + ";border-radius:5px;}"  # 两层中括号
        self.pushButton.setStyleSheet(f"""QPushButton{backgroundcolor}""")

    def change_gangwei_color_and_shape(self):
        gangwei = self.buttunname
        # 更改按键储存的信息
        rec_new = ui.save_data_layout[gangwei]
        re0 = rec_new[0]
        re1 = rec_new[1]
        re2 = int(self.lineEdit_wid.text())  # 改高度
        re3 = int(self.lineEdit_hig.text())  # 改长度
        re4 = self.color  # 改颜色
        ui.save_data_layout[gangwei] = (re0, re1, re2, re3, re4)  # 重新储存
        rec = (re0, re1, re2, re3, re4)
        # 确定更改按键颜色
        backgroundcolor = "{font-size:25px;background:" + f"{self.color}" + ";}"  # 两层中括号border-radius:5px;
        self.anjian.setStyleSheet(f"""QPushButton{backgroundcolor}""")
        self.anjian.setGeometry(QRect(rec[0], rec[1] - 55, rec[2], 30))
        print("changed")
        # 改变框体大小
        print(rec[0], rec[1], rec[2], rec[3], rec[4])  # 左上点和 宽。高self.centralwidget
        ui.__dict__["gridLayoutWidget" + gangwei].setGeometry(QRect(rec[0], rec[1] - 20, rec[2], rec[3]))  # 容器大小
        self.close()


# 人员类按键右键打开的窗口
class newwindow_rightclict(QWidget, Ui_Rrightclickform):
    def __init__(self, anjian):
        super(newwindow_rightclict, self).__init__()
        self.setupUi(self)
        self.current_anjian = anjian

    def init_2(self):
        self.comboBoxjiezou.clear()

        self.comboBox_tubiao.clear()
        self.comboBox.clear()
        self.comboBoxjiezou.addItems(["无"])
        self.comboBox_tubiao.addItems(["无"])

        self.comboBoxjiezou.addItems(ui.save_data_jiezou)
        self.comboBox_tubiao.addItems(ui.save_data_tubiao.keys())
        self.comboBox.addItems(ui.save_data_zhuangtai)

    def add_jiezou(self):
        self.comboBoxjiezou.addItems([self.lineEdit.text()])
        ui.save_data_jiezou.append(self.lineEdit.text())

    def add_zhuangtai(self):
        self.comboBox.addItems([self.lineEdit_3.text()])
        ui.save_data_zhuangtai.append(self.lineEdit_3.text())

    def add_tubiao(self):
        tubiao_name = self.lineEdit_2.text()
        if tubiao_name:  # 如果不是空,可以增加
            # 过滤类型('F:/pythonvenu/boy/icon.ico', 'ICO Files(*.ico)')
            filepath_tubiao = QFileDialog.getOpenFileName(filter='ICO Files(*.ico)')
            # filepath_tubiao = QFileDialog.getOpenFileName(filter='ICO Files(*)')#all
            # filepath_dir = os.path.basename(filepath_tubiao[0])  # icon.ico 相对路径
            filepath_dir = filepath_tubiao[0]  # icon.ico  绝对路径
            self.pushButton_4.setIcon(QIcon(filepath_dir))  # 自身增加图标
            ui.save_data_tubiao[tubiao_name] = filepath_dir
            self.comboBox_tubiao.addItems([tubiao_name])
        else:
            QtWidgets.QMessageBox.information(self, "异常", "请先填写图标名称")

    def clear_jiezou_and_tubiao(self):  # 清楚接走/图标/状态
        self.comboBoxjiezou.clear()
        self.comboBoxjiezou.addItems(["无"])
        self.comboBox_tubiao.clear()
        self.comboBox_tubiao.addItems(["无"])
        self.comboBox.clear()
        ui.save_data_tubiao = dict()
        ui.save_data_jiezou = []
        ui.save_data_zhuangtai = ["在位"]

    def delputbutton(self):  # 删除按键
        del ui.save_data_anjian[self.current_anjian.text()]  # 从数据库里删除
        self.current_anjian.deleteLater()  # 不显示本按键
        del self.current_anjian  # 删除本按键

    def zhuangtai_ok(self):
        jiezou = self.comboBoxjiezou.currentText()  # 借走了啥
        tubiao = self.comboBox_tubiao.currentText()  # 做了哪些标记
        # 保存按键属性
        ui.save_data_anjian[self.current_anjian.name][2] = jiezou
        ui.save_data_anjian[self.current_anjian.name][3] = tubiao
        ui.save_data_anjian[self.current_anjian.name][4] = self.comboBox.currentText()  # 人员状态
        # 借走;如果没借,不多显示
        if jiezou == "无":
            self.current_anjian.setText(self.current_anjian.name)  # 清除标记
        else:
            self.current_anjian.setText(self.current_anjian.name + "--" + jiezou)  # 否则显示借阅
        # 图标
        if tubiao == 0:
            pass
        elif tubiao == "无":  # 如果没标记,清除标记
            self.current_anjian.setIcon(QIcon())
        else:
            self.current_anjian.setIcon(QIcon(ui.save_data_tubiao[tubiao]))  # 增加图标
            # self.current_anjian.setIcon(QApplication.style().standardIcon(13))#增加系统自带的ICON类图标
        # 当前按键颜色
        color_now = ui.newboyshow.save_data_shenfen[ui.save_data_anjian[self.current_anjian.name][0]]
        annother_color = "#%06X" % (0xFFFFFF ^ int(color_now[1:], 16))  # 取得对比度最高的颜色

        # 在位状态,如果不在位,改变其颜色
        if self.comboBox.currentIndex():
            # 设置渐变色font-size:30px;font-size:30px;
            color = f"qlineargradient(sprea:repeat,x1:0,y1:0,x2:1,y2:1,stop:0 {annother_color},stop:0.5 {color_now})"
            backgroundcolor = "{font-weight:bold;color:" + f"{annother_color}" + ";background:" + f"{color}" + ";border-radius:10px;}QPushButton:hover{background:yellow;}'''"  # 两层中括号
            self.current_anjian.setStyleSheet(f"""QPushButton{backgroundcolor}""")  # 两层中括号需要两次使用
        elif self.comboBox.currentIndex() == 0:
            backgroundcolor = "{font-weight:bold;color:" + f"{annother_color}" + ";background:" + f"{color_now}" + ";border-radius:5px;}QPushButton:hover{background:yellow;}'''"  # 两层中括号
            self.current_anjian.setStyleSheet(f"""QPushButton{backgroundcolor}""")  # 两层中括号需要两次使用


# 人员类按键
class Button(QPushButton):

    def __init__(self, name, parent, gangwei):
        super().__init__(name, parent)
        self.name = name
        self.gangwei = gangwei
        self.new_right = newwindow_rightclict(self)

    # 重构mouseMoveEvent方法
    def mouseMoveEvent(self, e):
        # 劫持按钮的左键事件,右键的操作还是默认行为
        if e.buttons() != Qt.LeftButton:
            return
        # 创建一个 QDrag 对象,用来传输MIME-based数据
        mimeData = QMimeData()  # <PyQt5.QtCore.QMimeData object at 0x03A772F8>
        drag = QDrag(self)  # 拖放类<PyQt5.QtGui.QDrag object at 0x03A77340>
        drag.setMimeData(mimeData)  # 临时数据
        drag.setHotSpot(e.pos() - self.rect().topLeft())
        # 拖放事件开始时,用到的处理函数式 start()
        dropAction = drag.exec_(Qt.MoveAction)

    # 重构mousePressEvent方法
    # 右键点击按钮,弹出新窗口
    def mousePressEvent(self, e):
        # 注意,我们在父级上也调用 了 mousePressEvent() 方法,
        # 不然的话,我们是看不到按钮按下的效果 的
        super().mousePressEvent(e)
        if e.button() == Qt.RightButton:
            self.new_right.init_2()
            self.new_right.show()
        if e.button() == Qt.LeftButton:  # 按压左键后显示小手抓取
            # self.setCursor(Qt.OpenHandCursor)
            ui.setCursor(Qt.ClosedHandCursor)


# 岗位类按键
class Buttongangwei(QPushButton):

    def __init__(self, parent, name, color, rect=QRect(0, 0, 0, 0), ):
        super().__init__(parent)  # 先调用父类Qpushbytton的初始化方法

        # self.rect=rect
        self.name = name
        self.setGeometry(rect)
        self.setObjectName(f"{self.name}")
        self.setText(f"{self.name}")
        self.new_right_gangwei = newwindow_change_gangwei(name, self)  # 实例化时候需要自己的文档和自己
        self.color = color  # 颜色选择画面,选择后按键的颜色
        backgroundcolor = "{font-size:25px;;background:" + f"{self.color}" + ";}"  # 两层中括号border-radius:5px;
        self.setStyleSheet(f"""QPushButton{backgroundcolor}""")

    def mouseMoveEvent(self, e):
        global U
        # 劫持按钮的左键事件,右键的操作还是默认行为
        if e.buttons() != Qt.LeftButton:  # 如果鼠标点击事件发生了,不是左键就结束,是左键就继续往下
            return
        U = 1  # 岗位按键左键拖动了

    # 重构mousePressEvent方法
    # 右键点击按钮,弹出画面
    def mousePressEvent(self, e):
        # 注意,我们在父级上也调用 了 mousePressEvent() 方法,
        # 不然的话,我们是看不到按钮按下的效果 的
        if e.button() == Qt.RightButton:
            self.new_right_gangwei.tongji()
            self.new_right_gangwei.show()
        if e.button() == Qt.LeftButton:  # 按压左键后显示小手抓取
            # self.setCursor(Qt.OpenHandCursor)
            ui.setCursor(Qt.ClosedHandCursor)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ui = MainWindow()
    ui.show()
    sys.exit(app.exec_())

最后

以上就是负责抽屉为你收集整理的python:岗位管理正式版2.0一继续之前的工作二介绍三示例四主程序代码的全部内容,希望文章能够帮你解决python:岗位管理正式版2.0一继续之前的工作二介绍三示例四主程序代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部