【Python】用PyQt5制作简单的图书借阅系统

目录

1.用PyQt5Designer设计窗体

主窗体

子窗体 

2.项目功能及代码

添加

子窗体函数

设置一个保存内容的文档 

 主窗体函数

删除

修改

 主窗体代码

 子窗体代码

搜索

菜单

 其他

主窗体

子窗体

窗口开始界面 

3.几个优化项目界面的功能

QMessageBox函数

设置背景图片

对提示栏进行设置 

对控件设置透明化

日期控件


1.用PyQt5Designer设计窗体

各个窗体控件的名字我都写在了下面

主窗体

子窗体 

具体设计思路可以看这篇博客:http://t.csdn.cn/9RKqx 

2.项目功能及代码

添加

子窗体函数

首先在子窗体定义一个函数,之后用槽函数把添加按钮和自定义函数连接起来。

 # 添加图书信息
    def insert(self):
        # 获取借阅者的姓名并去除前面的空格1
        # strip去除开头或结尾的空格
        name = self.lineEdit_2.text().strip()
        books = self.lineEdit.text().strip()
        time1 = self.dateEdit.text()
        time2 = self.dateEdit_2.text()
        if len(name) <= 0 or len(books) <= 0:
            # 如果有一个为空位,提示消息并结束此函数
            QMessageBox.information(self, "提示", "家人,咱这输入的不对,要不把空格去掉。", QMessageBox.Ok)
            return
        # 创建对象并初始化属性
        newBook = mybook.Books(name, books, time1, time2)
        # 把新学员对象追加到全局的学员列表中
        mybook.Book.append(newBook)
        # 获取表格控件的行数量
        # rowCount获取当前表格部件中的行数
        row = self.tableWidget.rowCount()
        # 以数量做索引添加一行
        # inserter_row用于在表格的指定位置插入一个新行
        self.tableWidget.insertRow(row)
        # 以借阅者为内容创建表格的一行
        item1 = QTableWidgetItem(name)
        item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.tableWidget.setItem(row, 0, item1)
        item2 = QTableWidgetItem(books)
        item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.tableWidget.setItem(row, 1, item2)
        item3 = QTableWidgetItem(time1)
        item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.tableWidget.setItem(row, 2, item3)
        item4 = QTableWidgetItem(time2)
        item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.tableWidget.setItem(row, 3, item4)
        # QMessageBox添加对话框
        result = QMessageBox.question(self, "消息", "添加成功,是否接着添加", QMessageBox.Yes | QMessageBox.No)
        if result == QMessageBox.Yes:
            self.lineEdit_2.setText('')
            self.lineEdit.setText('')
        if result == QMessageBox.No:
            self.close()

设置一个保存内容的文档 

因为我还没有学习数据库,所以想要保存到表格的内容只能暂时用一个文档储存起来

import os

Book = []


def saveStudents():
    current_path = os.getcwd() + "\\Book.txt"
    f = open(current_path, "w+")
    for item in Book:
        f.write(item.name + ' ' + item.books + ' ' + item.time1 + ' ' + item.time2 + '\n')
    f.close()


class Books(object):
    def __init__(self, name, books, time1, time2):
        self.name = name
        self.books = books
        self.time1 = time1
        self.time2 = time2

 主窗体函数

首先定义一个打开子窗体的函数

 def openmainWindow(self):
        # 创建子窗体对象,并传参。
        self.child = UiMainwindow(-1, "添加", self.tableWidget)
        self.child.setWindowModality(Qt.ApplicationModal)
        # 固定子窗体的大小
        self.child.setFixedSize(self.child.width(), self.child.height())
        # 设置子窗体以模态方式打开
        self.child.setWindowModality(Qt.ApplicationModal)
        # 展示
        self.child.show()

删除

# 删除功能
    def deleteStu(self):
        # 获取表格控件中的选中行索引
        index = self.tableWidget.currentRow()
        # 判断是否有选中行
        if index < 0:
            # 如果没有选中行,提示消息并结束此函数
            QMessageBox.information(None, "提示", "请选中删除行", QMessageBox.Ok)
            return
        # 消息框询问是否继续添加,接收返回值
        result = QMessageBox.question(None, "消息", "是否删除选中行?", QMessageBox.Yes | QMessageBox.No)
        # 判断返回值是否消息框的No按钮
        if result == QMessageBox.Yes:
            # 获取表格控件选中行第一列的内容
            name = self.tableWidget.selectedItems()[0].text()
            # 删除表格控件中索引所在行
            self.tableWidget.removeRow(index)
            # 循环学员列表
            for item in Book:
                # 如果学员姓名等于删除行第一列内容
                if item.name == name:
                    # 从学员列表中删除此学员
                    Book.remove(item)
                    break

修改

 主窗体代码

 # 打开修改窗体
    def modifyDialogOpen(self):
        index = self.tableWidget.currentRow()
        # 如果没有选中行
        if index < 0:
            QMessageBox.information(None, "提示", "请选中修改的信息", QMessageBox.Ok)
            return
        # 获取表格控件中的行的第一行内容
        name = self.tableWidget.selectedItems()[0].text()
        # 定义变量保存选中学员列表中的索引
        index = 0
        # 循环学员列表
        for item in Book:
            if name == item.name:
                break
            # 学员列表索引+1
            index += 1
            # 创建窗口对象并传参
        self.child = UiMainwindow(index, "修改", self.tableWidget)
        # 设置窗口以应用程序模态打开
        self.child.setWindowModality(Qt.ApplicationModal)
        # 设置窗口不可调整大小
        self.child.setFixedSize(self.child.width(), self.child.height())
        self.child.show()

 子窗体代码

 # 修改信息
    def alter(self):
        # 获取借阅者的姓名并去除前面的空格
        # strip去除开头或结尾的空格
        name = self.lineEdit_2.text().strip()
        books = self.lineEdit.text().strip()
        time1 = self.dateEdit.text()
        time2 = self.dateEdit_2.text()
        # dateEdit = QDateTimeEdit(QDate.currentDate(), self)
        if len(name) <= 0 or len(books) <= 0:
            # 如果有一个为空位,提示消息并结束此函数
            QMessageBox.information(self, "提示", "家人,咱这输入的不对。", QMessageBox.Ok)
            return
        # 设置表格控件中选中列的文本文件
        self.tableWidget.selectedItems()[0].setText(name)
        self.tableWidget.selectedItems()[1].setText(books)
        self.tableWidget.selectedItems()[2].setText(time1)
        self.tableWidget.selectedItems()[3].setText(time2)
        mybook.Book[self.index].name = name
        mybook.Book[self.index].books = books
        mybook.Book[self.index].time1 = time1
        mybook.Book[self.index].time2 = time2
        # 关闭
        result = QMessageBox.question(self, "消息", "修改成功", QMessageBox.Ok)
        if result == QMessageBox.Ok:
            self.close()
        self.close()

搜索

# 查找功能
    def finding(self):
        # 获取查询的文本框内容并取消前后空格
        name = self.lineEdit.text().strip()
        # 判断查询内容是否为空
        if len(name) <= 0:
            # 如果为空,提示用户
            QMessageBox.information(None, "提示", "请输入借阅者姓名", QMessageBox.Ok)
            # 结束此函数
            return
        # 设置表格控件的数据行为0
        self.tableWidget.setRowCount(0)
        # 清空表格控件的内容,与上面一行共同使用清空所有行
        self.tableWidget.clearContents()
        # 循环学员列表,重新加载学员信息显示在表格控件
        for item in Book:
            if name == item.name:
                # 获取表格控件的行数
                row = self.tableWidget.rowCount()
                # 根据行数做索引添加一行
                self.tableWidget.insertRow(row)
                # 创建列对象,内容是学员名称
                item1 = QTableWidgetItem(item.name)
                # 水平垂直方向居中
                item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                # 把新建的列对象设置在表格控件索引row所在行,索引0所在列
                self.tableWidget.setItem(row, 0, item1)
                item2 = QTableWidgetItem(item.books)
                item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                # 把新建的列对象设置在表格控件索引row所在行,索引1
                self.tableWidget.setItem(row, 1, item2)
                item3 = QTableWidgetItem(item.time1)
                item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                # 把新建的列对象设置在表格控件索引row所在行,索引2所在列
                self.tableWidget.setItem(row, 2, item3)
                item4 = QTableWidgetItem(item.time2)
                item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                # 把新建的列对象设置在表格控件索引row所在行,索引3 所在列
                self.tableWidget.setItem(row, 3, item4)
                break

搜索借阅者的名字,可以搜索到想要的同学 

菜单

点击鼠标右键,可弹出添加、删除。修改。三个基本功能,另外我又添加了返回功能,是在搜索之后点击菜单返回表格全部内容。

    # 弹出菜单
    def rightShowMenu(self):
        rightMenu = QMenu()
        menu1 = rightMenu.addAction("添加")
        menu1.triggered.connect(self.openmainWindow)
        menu2 = rightMenu.addAction("修改")
        menu2.triggered.connect(self.modifyDialogOpen)
        menu3 = rightMenu.addAction("删除")
        menu3.triggered.connect(self.deleteStu)
        menu4 = rightMenu.addAction("返回")
        menu4.triggered.connect(self.back)
        rightMenu.show()
        rightMenu.exec_(QCursor.pos())

返回功能很简单,先把表格当前内容删除,然后重新加载全部内容。 

 # 显示——学员信息显示在 tableWidget 中
    def back(self):
        # 设置表格控件的数据行为0
        self.tableWidget.setRowCount(0)
        # 清空表格控件的内容,与上面一行共同使用清空所有行
        self.tableWidget.clearContents()
        # 循环学员信息列表
        for item in Book:
            # 获取表格控件的行数
            row = self.tableWidget.rowCount()
            self.tableWidget.insertRow(row)
            item1 = QTableWidgetItem(item.name)
            item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.tableWidget.setItem(row, 0, item1)
            item2 = QTableWidgetItem(item.books)
            item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.tableWidget.setItem(row, 1, item2)
            item3 = QTableWidgetItem(item.time1)
            item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.tableWidget.setItem(row, 2, item3)
            item4 = QTableWidgetItem(item.time2)
            item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.tableWidget.setItem(row, 3, item4)

 其他

主窗体

# 学员信息显示到table控件里
    def loadTable(self):
        # 循环学员信息列表
        for item in Book:
            # 获取表格控件的行数
            row = self.tableWidget.rowCount()
            # 根据行数做索引添加一列
            self.tableWidget.insertRow(row)
            # 创建列对象
            item1 = QTableWidgetItem(item.name)
            item1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.tableWidget.setItem(row, 0, item1)
            item2 = QTableWidgetItem(item.books)
            item2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.tableWidget.setItem(row, 1, item2)
            item3 = QTableWidgetItem(item.time1)
            item3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.tableWidget.setItem(row, 2, item3)
            item4 = QTableWidgetItem(item.time2)
            item4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
            self.tableWidget.setItem(row, 3, item4)

子窗体

    def insert_expurgate(self):
        # 判断标题来进行修改或添加
        if self.title == "添加":
            self.insert()
        else:
            self.alter()

    # 窗体加载时调用
    def myInitWindow(self):
        # 单击保存按钮调用函数
        self.OK.clicked.connect(self.insert_expurgate)
        # 如果标题是修改
        if self.title == "修改":
            self.lineEdit_2.setText(self.tableWidget.selectedItems()[0].text())
            self.lineEdit.setText(self.tableWidget.selectedItems()[1].text()
        self.dateEdit.setDate(QDate.currentDate())
        self.dateEdit_2.setDate(QDate.currentDate().addDays(30))

窗口开始界面 

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from untitled1 import *


class ManagerWindow(QMainWindow):
    def closeEvent(self, event):
        result = QtWidgets.QMessageBox.question(self, "退出", "是否保存后退出?",
                                                QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)

        if result == QtWidgets.QMessageBox.Yes:
            saveStudents()
        # 执行关闭功能
        event.accept()


# 程序入口
if __name__ == '__main__':  # python模拟程序入口
    # 创建主窗体
    app = QApplication(sys.argv)
    # 设计的UI界面实体化
    ui = Ui_Dialog()
    # 创建主窗体对象,一个应用程序可以有多个窗体,但是一个窗体不能代表一个应用程序。
    MainWindow = ManagerWindow()
    # 把所有用到的控件化在主窗体上。
    ui.setupUi(MainWindow)
    # 设置窗体大小不能更改
    MainWindow.setFixedSize(MainWindow.width(), MainWindow.height())
    # 主窗体自己的宽        #主窗体自己的高
    # 显示主窗体
    MainWindow.show()
    sys.exit(app.exec_())

3.几个优化项目界面的功能

QMessageBox函数

大家可能好奇QMessageBox函数,它的功能是产生一个提示框,在报错或者删除时弹出来提示。

 

result = QMessageBox.question(self, "消息", "添加成功,是否接着添加",
 QMessageBox.Yes | QMessageBox.No)

QMessageBox.information(self, "提示", "家人,咱这输入的不对,要不把空格去掉。", QMessageBox.Ok)

设置背景图片

# 设置窗体背景图片
        palette = QPalette()
        pix = QPixmap("项目图片/feb1fe93862d873eacf66dd4d82d307e.jpg")
        # # 自调背景图大小和窗体适应
        pix = pix.scaled(mainWindow.width(), mainWindow.height())
        palette.setBrush(QPalette.Background, QBrush(pix))
        mainWindow.setPalette(palette)

对提示栏进行设置 

 # 设置搜索栏提示信息
        self.lineEdit.setPlaceholderText('请输入要查询的学生姓名……')

对控件设置透明化

 # 控件半透明设置
        op = QtWidgets.QGraphicsOpacityEffect()
        # 0.7是控件的半透明程度
        op.setOpacity(0.7)
        self.lineEdit.setGraphicsEffect(op)
        self.lineEdit.setAutoFillBackground(True)

日期控件

这个代码可以让日期控件上显示当前日期

        self.dateEdit.setDate(QDate.currentDate())
        # addDays是在原基础上增加的天数
        self.dateEdit_2.setDate(QDate.currentDate().addDays(30))

 需要原码的可以到下面链接下载:

PyQt5+Python做的图书借阅系统-Python文档类资源-CSDN文库

如果下载不了可以后台私信我,好本篇博客内容就到这里感谢您的观看,如果对您有帮助的话请留下你的赞。 

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-李华同学-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值