程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【Python】用PyQt5制作簡單的圖書借閱系統

編輯:Python

目錄

1.用PyQt5Designer設計窗體

主窗體

子窗體 

2.項目功能及代碼

添加

子窗體函數

設置一個保存內容的文檔 

 主窗體函數

刪除

修改

 主窗體代碼

 子窗體代碼

搜索

菜單

 其他

主窗體

子窗體

窗口開始界面 

3.幾個優化項目界面的功能

QMessageBox函數

設置背景圖片

對提示欄進行設置 

對控件設置透明化

日期控件


1.用PyQt5Designer設計窗體

各個窗體控件的名字我都寫在了下面

主窗體

子窗體 

 

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))


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved