之前学习PyQt5,然后那段时间想做一个桌面小程序,后来由于学习内容较多就做了一小部分,但是可以进行页面跳转。大家如果是初学者对Python感兴趣而且刚学数据库时可以看看代码,可能会有点启发。
效果:
登录进来是这:
实现了账号密码的增删改功能
结构很简单
源代码如下:
database.py
import pymysql # 导入操作MySQL数据库的模块userName="" # 记录用户名# 打开数据库连接
def open():db = pymysql.connect(host="localhost", user="root", passwd="123456", database="db_goods",charset="utf8")return db # 返回连接对象#数据库增删改
def exec(sql,values):db=open() # 连接数据库cursor = db.cursor() # 使用cursor()方法获取操作游标try:cursor.execute(sql,values) # 执行增删改的SQL语句db.commit() # 提交数据return 1 # 执行成功except:db.rollback() # 发生错误时回滚return 0 # 执行失败finally:cursor.close() # 关闭游标db.close() # 关闭数据库连接
# 带参数的精确查询
def query(sql,*keys):db=open() # 连接数据库cursor = db.cursor() # 使用cursor()方法获取操作游标cursor.execute(sql,keys) # 执行查询SQL语句result = cursor.fetchall() # 记录查询结果cursor.close() # 关闭游标db.close() # 关闭数据库连接return result # 返回查询结果
# 不带参数的模糊查询
def query2(sql):db=open() # 连接数据库cursor = db.cursor() # 使用cursor()方法获取操作游标cursor.execute(sql) # 执行查询SQL语句result = cursor.fetchall() # 记录查询结果cursor.close() # 关闭游标db.close() # 关闭数据库连接return result # 返回查询结果
图片要放在这种文件里
<RCC><qresource prefix="newPrefix"><file>images/loginPIC.jpg</file><file>images/main.jpg</file></qresource>
</RCC>
需要用到这个工具,大家自己查一下,很容易配置
login.py
#login.py
from PyQt5 import QtCore, QtGui, QtWidgets
import dataBase
from PyQt5.QtWidgets import QMessageBox
import main
from PyQt5.QtWidgets import *class Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint)MainWindow.resize(485, 280)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(0, 0, 261, 281))self.label.setPixmap(QtGui.QPixmap(":/newPrefix/images/loginPIC.jpg"))self.label.setObjectName("label")self.label_user = QtWidgets.QLabel(self.centralwidget)self.label_user.setGeometry(QtCore.QRect(270, 70, 72, 41))self.label_user.setObjectName("label_2")self.label_pwd = QtWidgets.QLabel(self.centralwidget)self.label_pwd.setGeometry(QtCore.QRect(270, 130, 72, 21))self.label_pwd.setObjectName("label_3")self.lineEdit_userName = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_userName.setGeometry(QtCore.QRect(330, 80, 113, 21))self.lineEdit_userName.setObjectName("lineEdit")self.lineEdit_userPasswd = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_userPasswd.setGeometry(QtCore.QRect(330, 130, 113, 21))self.lineEdit_userPasswd.setObjectName("lineEdit_2")self.lineEdit_userPasswd.setEchoMode(QtWidgets.QLineEdit.Password)self.pushButton_login = QtWidgets.QPushButton(self.centralwidget)self.pushButton_login.setGeometry(QtCore.QRect(290, 190, 61, 28))self.pushButton_login.setObjectName("pushButton")self.pushButton_exit = QtWidgets.QPushButton(self.centralwidget)self.pushButton_exit.setGeometry(QtCore.QRect(370, 190, 61, 28))self.pushButton_exit.setObjectName("pushButton_2")MainWindow.setCentralWidget(self.centralwidget)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)self.pushButton_exit.clicked.connect(MainWindow.close) # 关闭登录窗体self.pushButton_login.clicked.connect(self.openMain) #登录def openMain(self):dataBase.userName = self.lineEdit_userName.text()userPasswd = self.lineEdit_userPasswd.text()if dataBase.userName and userPasswd:result = dataBase.query("select * from goods_user where userName = %s and userPasswd = %s", dataBase.userName, userPasswd)if len(result) > 0:self.main_window = QtWidgets.QMainWindow()self.main_ui = main.Ui_MainWindow()self.main_ui.setupUi(self.main_window)self.main_window.show()MainWindow.hide()else:self.lineEdit_userName.setText("")self.lineEdit_userPasswd.setText("")QMessageBox.warning(None, '警告', '请输入正确的用户名和密码!', QMessageBox.Ok)else:QMessageBox.warning(None, '警告', '请输入用户名和密码!', QMessageBox.Ok)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "二手商品信息管理平台登录"))self.label_user.setText(_translate("MainWindow", "用户名:"))self.label_pwd.setText(_translate("MainWindow", "密 码:"))self.pushButton_login.setText(_translate("MainWindow", "登录"))self.pushButton_exit.setText(_translate("MainWindow", "退出"))import img_rc
import sysif __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)MainWindow = QtWidgets.QMainWindow()ui = Ui_MainWindow()ui.setupUi(MainWindow)MainWindow.show()sys.exit(app.exec_())
main.py
#login.py
from PyQt5 import QtCore, QtGui, QtWidgets
import dataBase
from PyQt5.QtWidgets import QMessageBox
import main
from PyQt5.QtWidgets import *class Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint)MainWindow.resize(485, 280)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(0, 0, 261, 281))self.label.setPixmap(QtGui.QPixmap(":/newPrefix/images/loginPIC.jpg"))self.label.setObjectName("label")self.label_user = QtWidgets.QLabel(self.centralwidget)self.label_user.setGeometry(QtCore.QRect(270, 70, 72, 41))self.label_user.setObjectName("label_2")self.label_pwd = QtWidgets.QLabel(self.centralwidget)self.label_pwd.setGeometry(QtCore.QRect(270, 130, 72, 21))self.label_pwd.setObjectName("label_3")self.lineEdit_userName = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_userName.setGeometry(QtCore.QRect(330, 80, 113, 21))self.lineEdit_userName.setObjectName("lineEdit")self.lineEdit_userPasswd = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_userPasswd.setGeometry(QtCore.QRect(330, 130, 113, 21))self.lineEdit_userPasswd.setObjectName("lineEdit_2")self.lineEdit_userPasswd.setEchoMode(QtWidgets.QLineEdit.Password)self.pushButton_login = QtWidgets.QPushButton(self.centralwidget)self.pushButton_login.setGeometry(QtCore.QRect(290, 190, 61, 28))self.pushButton_login.setObjectName("pushButton")self.pushButton_exit = QtWidgets.QPushButton(self.centralwidget)self.pushButton_exit.setGeometry(QtCore.QRect(370, 190, 61, 28))self.pushButton_exit.setObjectName("pushButton_2")MainWindow.setCentralWidget(self.centralwidget)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)self.pushButton_exit.clicked.connect(MainWindow.close) # 关闭登录窗体self.pushButton_login.clicked.connect(self.openMain) #登录def openMain(self):dataBase.userName = self.lineEdit_userName.text()userPasswd = self.lineEdit_userPasswd.text()if dataBase.userName and userPasswd:result = dataBase.query("select * from goods_user where userName = %s and userPasswd = %s", dataBase.userName, userPasswd)if len(result) > 0:self.main_window = QtWidgets.QMainWindow()self.main_ui = main.Ui_MainWindow()self.main_ui.setupUi(self.main_window)self.main_window.show()MainWindow.hide()else:self.lineEdit_userName.setText("")self.lineEdit_userPasswd.setText("")QMessageBox.warning(None, '警告', '请输入正确的用户名和密码!', QMessageBox.Ok)else:QMessageBox.warning(None, '警告', '请输入用户名和密码!', QMessageBox.Ok)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "二手商品信息管理平台登录"))self.label_user.setText(_translate("MainWindow", "用户名:"))self.label_pwd.setText(_translate("MainWindow", "密 码:"))self.pushButton_login.setText(_translate("MainWindow", "登录"))self.pushButton_exit.setText(_translate("MainWindow", "退出"))import img_rc
import sysif __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)MainWindow = QtWidgets.QMainWindow()ui = Ui_MainWindow()ui.setupUi(MainWindow)MainWindow.show()sys.exit(app.exec_())
user.py
#user.py
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox, QTableWidgetItem, QMainWindowimport dataBaseclass Ui_MainWindow(QMainWindow):# 构造方法def __init__(self):super(Ui_MainWindow, self).__init__()self.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint) # 只显示最小化和关闭按钮self.setupUi(self) # 初始化窗体设置def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(546, 423)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.tableinfo = QtWidgets.QTableWidget(self.centralwidget)self.tableinfo.setGeometry(QtCore.QRect(0, 0, 400, 420))self.tableinfo.setObjectName("tableWidget")self.tableinfo.setColumnCount(2)self.tableinfo.setRowCount(0)item = QtWidgets.QTableWidgetItem()item.setTextAlignment(QtCore.Qt.AlignCenter)self.tableinfo.setHorizontalHeaderItem(0, item)item = QtWidgets.QTableWidgetItem()item.setTextAlignment(QtCore.Qt.AlignCenter)self.tableinfo.setHorizontalHeaderItem(1, item)self.tableinfo.setColumnWidth(0, 195)# 调整第一列(索引0)的宽度到特定宽度self.tableinfo.setColumnWidth(1, 195)# 调整第二列(索引1)的宽度到特定宽度self.tableinfo.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)#表格列将根据窗口大小自动调整宽度,以填充整个表格而不会出现水平滚动条。self.pushButton_add = QtWidgets.QPushButton(self.centralwidget)self.pushButton_add.setGeometry(QtCore.QRect(440, 180, 61, 31))self.pushButton_add.setObjectName("pushButton")self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(400, 110, 61, 21))self.label.setObjectName("label")self.lineEdit_userName = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_userName.setGeometry(QtCore.QRect(460, 110, 71, 21))self.lineEdit_userName.setObjectName("lineEdit")self.label_2 = QtWidgets.QLabel(self.centralwidget)self.label_2.setGeometry(QtCore.QRect(410, 140, 51, 20))self.label_2.setObjectName("label_2")self.lineEdit_passwd = QtWidgets.QLineEdit(self.centralwidget)self.lineEdit_passwd.setGeometry(QtCore.QRect(460, 140, 71, 21))self.lineEdit_passwd.setObjectName("lineEdit_2")self.pushButton_edit = QtWidgets.QPushButton(self.centralwidget)self.pushButton_edit.setGeometry(QtCore.QRect(440, 230, 61, 31))self.pushButton_edit.setObjectName("pushButton_2")self.pushButton_del = QtWidgets.QPushButton(self.centralwidget)self.pushButton_del.setGeometry(QtCore.QRect(440, 270, 61, 31))self.pushButton_del.setObjectName("pushButton_3")MainWindow.setCentralWidget(self.centralwidget)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)self.tableinfo.setAlternatingRowColors(True) # 使表格颜色交错显示self.tableinfo.verticalHeader().setVisible(False) # 隐藏垂直标题self.query() # 窗体加载时显示所有数据self.tableinfo.itemClicked.connect(self.getItem) # 获取选中的单元格数据self.pushButton_add.clicked.connect(self.add)self.pushButton_edit.clicked.connect(self.edit) # 绑定修改按钮的单击信号self.pushButton_del.clicked.connect(self.delete) # 绑定删除按钮的单击信号def query(self):self.tableinfo.setRowCount(0) # 清空表格中的所有行result = dataBase.query("select * from goods_user") # 调用服务类中的公共方法执行查询语句row = len(result) # 取得记录个数,用于设置表格的行数self.tableinfo.setRowCount(row) # 设置表格行数self.tableinfo.setColumnCount(2) # 设置表格列数for i in range(row): # 遍历行for j in range(self.tableinfo.columnCount()): # 遍历列data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格data.setFlags(data.flags() & ~QtCore.Qt.ItemIsEditable) # 设置单元格为只读self.tableinfo.setItem(i, j, data) # 设置每个单元格的数据def getItem(self, item):if item.column() == 0: # 如果点击的是第一列self.select1 = item.text() # 获取点击单元格的文本row = item.row() # 获取点击单元格所在的行item2 = self.tableinfo.item(row, 1) # 获取同一行第二列的项if item2 is not None:self.select2 = item2.text()self.lineEdit_userName.setText(self.select1) # 显示在用户名文本框中self.lineEdit_passwd.setText(self.select2) # 显示在密码文本框中if item.column() == 1:self.select2 = item.text()row = item.row()item1 = self.tableinfo.item(row, 0)if item1 is not None:self.select1 = item1.text()self.lineEdit_userName.setText(self.select1)self.lineEdit_passwd.setText(self.select2)def add(self):userName = self.lineEdit_userName.text() # 记录输入的用户名userPwd = self.lineEdit_passwd.text() # 记录输入的用户密码if userName != "" and userPwd != "": # 判断用户名和密码不为空# 执行添加语句result=dataBase.exec("insert into goods_user(userName,userPasswd) values (%s,%s)",(userName,userPwd))if result>0: # 如果结果大于0,说明添加成功self.query() # 在表格中显示最新数据QMessageBox.information(None, '提示', '信息添加成功!', QMessageBox.Ok)else:QMessageBox.warning(None, '警告', '请输入数据后,再执行相关操作!', QMessageBox.Ok)def edit(self):try:if self.select1!="": # 判断是否选择了要修改的数据userPwd = self.lineEdit_passwd.text() # 记录修改的用户密码if userPwd != "": # 判断密码不为空# 执行修改操作result=dataBase.exec("update goods_user set userPasswd= %s where userName=%s",(userPwd,self.select1))if result>0: # 如果结果大于0,说明修改成功self.query() # 在表格中显示最新数据QMessageBox.information(None, '提示', '信息修改成功!', QMessageBox.Ok)except:QMessageBox.warning(None, '警告', '请先选择要修改的数据!', QMessageBox.Ok)def delete(self):try:if self.select1!="": # 判断是否选择了要删除的数据# 执行删除操作result=dataBase.exec("delete from goods_user where userName= %s",(self.select1,))if result>0: # 如果结果大于0,说明删除成功self.query() # 在表格中显示最新数据QMessageBox.information(None, '提示', '信息删除成功!', QMessageBox.Ok)except:QMessageBox.warning(None, '警告', '请先选择要删除的数据!', QMessageBox.Ok)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "账号密码设置"))item = self.tableinfo.horizontalHeaderItem(0)item.setText(_translate("MainWindow", "用户名"))item = self.tableinfo.horizontalHeaderItem(1)item.setText(_translate("MainWindow", "密码"))self.pushButton_add.setText(_translate("MainWindow", "添加"))self.label.setText(_translate("MainWindow", " 用 户:"))self.label_2.setText(_translate("MainWindow", "密 码:"))self.pushButton_edit.setText(_translate("MainWindow", "修改"))self.pushButton_del.setText(_translate("MainWindow", "删除"))