Python:写了个人员管理软件

本文档介绍了一个使用Python和Qt开发的人员管理软件。该软件包含岗位管理、人员新增、人员拖动调整岗位以及保存读取功能。通过pydesigner生成UI界面,并实现了拖动操作。代码分为多个部分,包括主代码、按钮处理等。
摘要由CSDN通过智能技术生成

一简介

本软件作用于人员管理,
1创建一个岗位管理界面,点击岗位管理之后,设置好岗位名称,拖动鼠标画框,完成岗位创建,之后里面可以放置人员。
  可以将之前建立的岗位删除,同时里面的人员也会删除。
2新增人员,包括(身份信息用不同颜色表示,岗位信息代表处于何种岗位)
3人员可以拖动到任意岗位,岗位也可以拖动到任意位置
4保存和读取功能

如图所示

,管理岗位

 新增人员

 人员状态管理

二 代码部分

分两次写的,借鉴很多,语法较乱,基本都有标注

pydesigner生成的四个界面内,然后重写按键类使其可以拖动

1主代码boy_main.py

# -*- coding:utf-8 -*-
import ast  # 文本转字典
import sys
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget  # 布局的框体
from boy_ui_main import Ui_MainWindow  # 导入第一个py,主窗口
from boy_ui_new import Ui_newboy  # 导入第二个py,新增成员窗口
from manager_ui_gangwei import Ui_widget  # 导入第三个py,岗位管理窗口
import button  # 导入的第四个py,按键重写,第四个窗口导入了这里

save_data_anjian = dict()  # 需要保存的按键字典
save_data_layout = dict()  # 需要保存的框体字典


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

    def __init__(self):
        super(MainWindow, self).__init__()  # 先调用父类QMainWindow的初始化方法
        self.setupUi(self)  # 再调用setupUi方法
        self.newboyshow = newwindow_anjian()  # 实例化新建成员窗口
        self.newgangweishow = newwindow_gangwei()  # 实例化管理岗位窗口

        self.add_boy.triggered.connect(self.newshow)  # 为增加人员按钮添加打开新窗口的动作
        self.saveaction.triggered.connect(self.savenow)  # 为保存增加保存savedata的动作
        self.openaction.triggered.connect(self.opennow)  # 为打开增加打开savedata的动作
        self.add_gangwei_huakuang.triggered.connect(self.manager_gangwei)  # 为增加岗位增加管理岗位功能,可以画了

        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#拖动岗位框体后的坐标

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

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

    # 画框用第二步--鼠标移动事件
    def mouseMoveEvent(self, event):
        # barHeight = self.bar.height()
        self.move = True
        if self.flag:
            self.x1 = event.pos().x()
            self.y1 = event.pos().y()
            self.update()

    # 画框用第三步,只要拖动就会一直绘制事件
    def paintEvent(self, event):
        super().paintEvent(event)
        painter = QPainter(self)  # 拖动时候的临时框
        painter.setPen(QPen(Qt.green, 2, Qt.SolidLine))#画笔设置
        # 打开之后,再画或者最大化以后才能出现,不知道为啥,对刷新不太了解
        for rec in save_data_layout.values():#遍历所有的框体,一直画
            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.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("鼠标放下")
            gangwei = self.gangwei  # 框体的临时名称
            rec = self.x0, self.y0, abs(self.x1 - self.x0), abs(self.y1 - self.y0)  # 位置和大小
            save_data_layout[gangwei] = rec  # 保存这个框体的数据
            # 同时建立一个布局和一个按钮显示布局信息
            self.draw_rect(gangwei, rec)  # 执行创建岗位命令
            self.sig_huakuang = 0  # 使其不能再画
        # print("岗位状态", button.Y.mouseMoveEvent(event),self.x1, self.y1,self.sig_huakuang)
        # 如果有岗位按键,并且现在不让画框,并且按了左键拖动了:那么移动岗位和布局控件,修改存储的数据,button.Y=目前的岗位框
        if button.Y and self.sig_huakuang == 0 and button.U:
            ganwgei = button.Y.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 - 30)
            # 更改数据信息
            # print(type(save_data_layout[ganwgei]))   <class 'tuple'> 单个值没法修改
            xx = save_data_layout[ganwgei][2]  # 只能更改字典值
            yy = save_data_layout[ganwgei][3]  # 只能更改字典值
            save_data_layout[ganwgei] = (self.x_move, self.y_move, xx, yy)  # 保存新的岗位信息

            button.U = 0  # 设置完了就不能动了,除非再点按钮
        self.x0, self.y0, self.x1, self.y1 = (0, 0, 0, 0)  # 鼠标重新设置

    # 画框体、按键、和布局.打开文件和创建时候用。同时增加人员岗位可选项
    def draw_rect(self, gangwei, rec):
        # print(rec[0], rec[1], rec[2], rec[3])#左上点和 宽。高self.centralwidget
        self.__dict__["gridLayoutWidget" + gangwei] = QWidget(self.centralwidget)  # 布局要放到个容器里
        self.__dict__["gridLayoutWidget" + gangwei].setGeometry(QRect(rec[0], rec[1], rec[2], rec[3]))  # 容器大小
        # self.__dict__["gridLayoutWidget" + gangwei].setObjectName(gangwei)#控件名字
        self.__dict__["layout" + gangwei] = QVBoxLayout()  # 做个垂直布局
        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] = button.Buttongangwei(self.centralwidget, gangwei, rectanjian)
        self.__dic
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是一个简单的考勤管理系统Python代码示例,使用MySQL数据库存储数据: ```python import mysql.connector # 连接MySQL数据库 db = mysql.connector.connect( host="localhost", user="yourusername", password="yourpassword", database="yourdatabase" ) # 获取数据库游标 cursor = db.cursor() # 创建考勤表 cursor.execute("CREATE TABLE attendance (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), time DATETIME)") # 插入考勤记录 name = input("请输入姓名:") sql = "INSERT INTO attendance (name, time) VALUES (%s, NOW())" val = (name,) cursor.execute(sql, val) db.commit() print(cursor.rowcount, "条记录插入成功。") # 查询考勤记录 cursor.execute("SELECT * FROM attendance") results = cursor.fetchall() print("考勤记录:") for result in results: print(result) # 关闭数据库连接 db.close() ``` 注意,在使用此代码之前,需要安装 `mysql-connector-python` 模块: ``` pip install mysql-connector-python ``` 另外,你需要将 `yourusername`、`yourpassword` 和 `yourdatabase` 替换为你自己MySQL数据库的用户名、密码和数据库名。 ### 回答2: 要用Python一个考勤管理系统并连接数据库,可以按照以下步骤进行实现: 1. 首先,需要安装Python的数据库连接库,如MySQL Connector、psycopg2等,根据使用的数据库类型选择相应的库进行安装。 2. 在Python中创建一个数据库连接的函数,用于连接到数据库。可以使用库提供的方法,传入数据库地址、用户名、密码等参数,建立与数据库的连接。 3. 创建一个考勤管理系统的类或函数,用于处理考勤相关的操作。这些操作可以包括添加考勤记录、查询考勤记录、统计考勤数据等。 4. 在考勤管理系统中,可以使用SQL语句或ORM(对象关系映射)工具,如SQLAlchemy等,根据数据库表的结构进行增删改查操作。 5. 通过调用数据库连接函数,在考勤管理系统中建立与数据库的连接。 6. 根据需求,编具体的功能函数或方法,如添加考勤记录的函数、查询考勤记录的函数等。在这些函数中,可以使用SQL语句或ORM工具执行数据库操作。 7. 测试考勤管理系统的各项功能,确保其与数据库的连接正常,并能正确执行相应的操作。 8. 在主程序中调用考勤管理系统的相关函数,实现考勤管理系统的运行。 总之,通过以上步骤,可以使用Python一个连接数据库的考勤管理系统。需要注意的是,考勤管理系统的具体实现方式、数据库的选择以及功能细节等,根据具体需求和环境可以有所不同。 ### 回答3: 考勤管理系统是一种用于管理员工上下班考勤记录的软件系统。Python是一种功能强大的编程语言,可以用于编这样的考勤管理系统,并与数据库进行连接。 首先,在Python中我们可以使用PyMySQL或者SQLAlchemy等库来连接数据库。假设我们选择使用PyMySQL来连接MySQL数据库。 我们可以在Python中创建一个考勤管理类,其中包含一些与考勤管理相关的方法。首先,我们需要连接到数据库。我们可以在构造函数中使用PyMySQL来连接到MySQL数据库,配置数据库的连接信息,如主机地址、用户名、密码、数据库名称等。 然后,我们可以定义一些方法来实现考勤管理的功能,比如添加考勤记录、删除考勤记录、查询考勤记录等。在这些方法中,我们可以使用SQL语句来操作数据库,执行插入、删除和查询等操作。我们可以使用PyMySQL提供的方法来执行SQL语句,比如execute()来执行插入和删除操作,fetchall()来获取查询结果等。 在考勤管理系统中,我们通常会涉及到员工信息的管理,比如员工的姓名、工号、部门等信息。我们可以创建一个员工类,其中包含这些员工信息的属性。在考勤管理系统中,我们可以使用员工对象来表示员工,并将其作为参数传递给考勤管理类的方法。 最后,在主程序中,我们可以创建一个考勤管理对象,并且调用其方法来完成考勤管理的操作。我们可以提供一个用户界面,通过用户的输入来调用相应的方法,完成考勤管理的功能。 总结起来,使用Python考勤管理系统可以通过连接到数据库,使用SQL语句操作数据库,定义相关的方法实现考勤管理的功能。通过对员工信息的管理,实现更加精确和高效的考勤管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值