赞
踩
上图是一开始程序设计界面,下图是最终设计界面。在代码设计初始阶段,做到UI和逻辑分离的设计,可以有效避免因UI界面更改造成的代码重写。
from PyQt5 import QtWidgets,QtGui,QtCore from DB_DIS_R import Ui_MainWindow #导入UI设计的代码段(由UI文件生成的.py文件) from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem, QMessageBox from PyQt5.QtCore import Qt import pymysql class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow): def __init__(self,parent=None): super(MainWindow,self).__init__(parent) self.setupUi(self) self.pb_wirte.clicked.connect(self.DB_Write) # self.pb_display.clicked.connect(self.DB_dis) self.PB_dengji.clicked.connect(self.dengji) # self.CB_price.setChecked(True) self.PB_search.clicked.connect(self.search) self.rb_priceasc.toggled.connect(self.order) self.rb_priced.toggled.connect(self.order) self.rb_publish.toggled.connect(self.order) #各种信号与函数的连接,不建议在qtdesigner中采用图形化的方式!!! self.tw_DB.verticalHeader().setVisible(False) # 取消tableview控件自动添加序号的功能 self.tw_DB.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
…先省略中间处理代码…再看看程序最后的代码段:
import sys
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
mainWindow = MainWindow()
# 实例化一个MainWindow
mainWindow.show()
sys.exit(app.exec_())
上述两步是实现UI与逻辑代码分离的关键步骤。
来看看处理逻辑:
首先可以通过qt5中的基本控件实现MYsql数据写入
由写入数据按钮触发------def DB_Write(self):
这包含了MYsql数据库的基本操作-------增加记录
def DB_Write(self):
db = pymysql.connect(host="127.0.0.1", user="root", password="leesky2008", database="mr")
cursor = db.cursor()
data = [("零基础学Python", "python", "100.20", "2018-5-20"),
("Python入门到实践", "python", "112.20", "2019-5-30"),
("零基C语言入门", "C", "17.20", "2017-5-22"),
("快来一起学java", "JAVA", "0.20", "2018-6-20"),
("学PHP", "php", "100.20", "2018-5-20")]
try:
cursor.executemany("insert into books(name,category,price,publish_time) values (%s,%s,%s,%s)", data)
# cursor.executemany("insert into books(name) values (%s)", "lixing")
db.commit()
except:
db.rollback()
db.close()
其次,通过radiobutton的选择实现基本的排序显示
为什么不再控件中排序???控件的排序功能很弱,不好用,没有按照数值排序的功能!!!tablewidget类控件数值排序功能体验不好。有解决方法的同学欢迎指教。
def order(self): if self.rb_priceasc.isChecked(): self.sqltext = "select * from books order by price ASC" print("价格升序") self.DB_dis() if self.rb_priced.isChecked(): self.sqltext = "select * from books order by price DESC" print("价格降序") self.DB_dis() if self.rb_publish.isChecked(): self.sqltext = "" self.sqltext = "select * from books order by publish_time DESC " print(self.sqltext) self.DB_dis() def DB_dis(self): # self.sqltext = "select * from books order by price DESC" sqltext=self.sqltext # print(sqltext) db = pymysql.connect(host="127.0.0.1", user="root", password="leesky2008", database="mr") cursor = db.cursor() cursor.execute(sqltext) # cursor.execute("select * from books order by publish_time desc") result=cursor.fetchall() row=cursor.rowcount vol=len(result[0]) cursor.close() db.close() self.tw_DB.setRowCount(row) self.tw_DB.setColumnCount(vol) self.tw_DB.setHorizontalHeaderLabels(['ID', '图书名称', "图书分类", "图书价格", "出版时间"]) for i in range(row): for j in range(vol): data = QTableWidgetItem(str(result[i][j])) self.tw_DB.setItem(i,j,data) self.tw_DB.resizeColumnsToContents() self.tw_DB.resizeRowsToContents() self.tw_DB.setAlternatingRowColors(True)
这是排序及在tablewidgets中显示的部分代码段。
在界面的右半部分,练习了数据的写入(获取控件中文本信息,写入数据库)
较为简单,代码放在最后的总代码中。
最后练习了数据查询并显示结果的代码操作,时间有限,只注重功能实现。
在图书名称中输入,点击查询按钮,可以查看搜索结果(模糊查询—注意查询语句的形式啊!!!!------血泪教训)
ef search(self): self.tw_DB.clear() print("kaishi") text=str(self.LE_bookname.text()) selectsql="select * from books where name like "+"'%"+text+"%'" print(selectsql) db = pymysql.connect(host="127.0.0.1", user="root", password="leesky2008", database="mr") cursor = db.cursor() cursor.execute(selectsql) result = cursor.fetchall() if self.LE_bookname.text()=="": QMessageBox.information(self, "提示", "请输入图书名称", QMessageBox.Ok) elif cursor.rowcount > 0: row = cursor.rowcount vol = len(result[0]) print(vol) cursor.close() db.close() self.tw_DB.setRowCount(row) self.tw_DB.setColumnCount(vol) self.tw_DB.setHorizontalHeaderLabels(['ID', '图书名称', "图书分类", "图书价格", "出版时间"]) for i in range(row): for j in range(vol): data = QTableWidgetItem(str(result[i][j])) self.tw_DB.setItem(i, j, data) self.tw_DB.setItem(i, j, data) self.tw_DB.resizeColumnsToContents() self.tw_DB.resizeRowsToContents() self.tw_DB.setAlternatingRowColors(True) else: print("查无此书") QMessageBox.information(self,"提示","没有这本书",QMessageBox.Ok)
1.UI部分
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'DB_DIS_R.ui' # # Created by: PyQt5 UI code generator 5.15.4 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 567) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.pb_wirte = QtWidgets.QPushButton(self.centralwidget) self.pb_wirte.setGeometry(QtCore.QRect(20, 450, 111, 41)) self.pb_wirte.setObjectName("pb_wirte") self.pb_display = QtWidgets.QPushButton(self.centralwidget) self.pb_display.setGeometry(QtCore.QRect(270, 450, 121, 41)) self.pb_display.setObjectName("pb_display") self.tw_DB = QtWidgets.QTableWidget(self.centralwidget) self.tw_DB.setGeometry(QtCore.QRect(20, 10, 371, 431)) self.tw_DB.setAutoScroll(True) self.tw_DB.setObjectName("tw_DB") self.tw_DB.setColumnCount(0) self.tw_DB.setRowCount(0) self.calendarWidget = QtWidgets.QCalendarWidget(self.centralwidget) self.calendarWidget.setGeometry(QtCore.QRect(520, 180, 248, 197)) self.calendarWidget.setObjectName("calendarWidget") self.layoutWidget = QtWidgets.QWidget(self.centralwidget) self.layoutWidget.setGeometry(QtCore.QRect(520, 40, 251, 131)) self.layoutWidget.setObjectName("layoutWidget") self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setObjectName("gridLayout") self.label = QtWidgets.QLabel(self.layoutWidget) self.label.setObjectName("label") self.gridLayout.addWidget(self.label, 3, 0, 1, 1) self.LE_bookprice = QtWidgets.QLineEdit(self.layoutWidget) self.LE_bookprice.setObjectName("LE_bookprice") self.gridLayout.addWidget(self.LE_bookprice, 1, 1, 1, 1) self.LE_bookname = QtWidgets.QLineEdit(self.layoutWidget) self.LE_bookname.setObjectName("LE_bookname") self.gridLayout.addWidget(self.LE_bookname, 0, 1, 1, 1) self.LE_publishtime = QtWidgets.QLineEdit(self.layoutWidget) self.LE_publishtime.setObjectName("LE_publishtime") self.gridLayout.addWidget(self.LE_publishtime, 3, 1, 1, 1) self.label_2 = QtWidgets.QLabel(self.layoutWidget) self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) self.label_3 = QtWidgets.QLabel(self.layoutWidget) self.label_3.setObjectName("label_3") self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.CB_bookskind = QtWidgets.QComboBox(self.layoutWidget) self.CB_bookskind.setObjectName("CB_bookskind") self.CB_bookskind.addItem("") self.CB_bookskind.addItem("") self.CB_bookskind.addItem("") self.CB_bookskind.addItem("") self.CB_bookskind.addItem("") self.CB_bookskind.addItem("") self.gridLayout.addWidget(self.CB_bookskind, 2, 1, 1, 1) self.label_4 = QtWidgets.QLabel(self.layoutWidget) self.label_4.setObjectName("label_4") self.gridLayout.addWidget(self.label_4, 2, 0, 1, 1) self.layoutWidget1 = QtWidgets.QWidget(self.centralwidget) self.layoutWidget1.setGeometry(QtCore.QRect(520, 400, 241, 31)) self.layoutWidget1.setObjectName("layoutWidget1") self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget1) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setObjectName("horizontalLayout") self.PB_dengji = QtWidgets.QPushButton(self.layoutWidget1) self.PB_dengji.setTabletTracking(False) self.PB_dengji.setObjectName("PB_dengji") self.horizontalLayout.addWidget(self.PB_dengji) self.PB_search = QtWidgets.QPushButton(self.layoutWidget1) self.PB_search.setObjectName("PB_search") self.horizontalLayout.addWidget(self.PB_search) self.rb_priceasc = QtWidgets.QRadioButton(self.centralwidget) self.rb_priceasc.setGeometry(QtCore.QRect(140, 450, 89, 16)) self.rb_priceasc.setObjectName("rb_priceasc") self.rb_priced = QtWidgets.QRadioButton(self.centralwidget) self.rb_priced.setGeometry(QtCore.QRect(140, 470, 89, 16)) self.rb_priced.setObjectName("rb_priced") self.rb_publish = QtWidgets.QRadioButton(self.centralwidget) self.rb_publish.setGeometry(QtCore.QRect(140, 490, 89, 16)) self.rb_publish.setObjectName("rb_publish") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "图书登记查询系统")) self.pb_wirte.setText(_translate("MainWindow", "写入数据库")) self.pb_display.setText(_translate("MainWindow", "显示数据库")) self.label.setText(_translate("MainWindow", "出版时间")) self.label_2.setText(_translate("MainWindow", "图书名称")) self.label_3.setText(_translate("MainWindow", "图书价格")) self.CB_bookskind.setItemText(0, _translate("MainWindow", "python")) self.CB_bookskind.setItemText(1, _translate("MainWindow", "java")) self.CB_bookskind.setItemText(2, _translate("MainWindow", "c#")) self.CB_bookskind.setItemText(3, _translate("MainWindow", "php")) self.CB_bookskind.setItemText(4, _translate("MainWindow", "labview")) self.CB_bookskind.setItemText(5, _translate("MainWindow", "c++")) self.label_4.setText(_translate("MainWindow", "图书种类")) self.PB_dengji.setText(_translate("MainWindow", "登记新书")) self.PB_search.setText(_translate("MainWindow", "查询书籍信息")) self.rb_priceasc.setText(_translate("MainWindow", "价格升序")) self.rb_priced.setText(_translate("MainWindow", "价格降序")) self.rb_publish.setText(_translate("MainWindow", "出版时间降序"))
2.逻辑处理部分
from PyQt5 import QtWidgets,QtGui,QtCore from DB_DIS_R import Ui_MainWindow from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem, QMessageBox from PyQt5.QtCore import Qt import pymysql class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow): def __init__(self,parent=None): super(MainWindow,self).__init__(parent) self.setupUi(self) self.pb_wirte.clicked.connect(self.DB_Write) # self.pb_display.clicked.connect(self.DB_dis) self.PB_dengji.clicked.connect(self.dengji) # self.CB_price.setChecked(True) self.PB_search.clicked.connect(self.search) self.rb_priceasc.toggled.connect(self.order) self.rb_priced.toggled.connect(self.order) self.rb_publish.toggled.connect(self.order) self.tw_DB.verticalHeader().setVisible(False) # 取消tableview控件自动添加序号的功能 self.tw_DB.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) # 设置表格内容不可编辑!!!! def DB_Write(self): db = pymysql.connect(host="127.0.0.1", user="root", password="leesky2008", database="mr") cursor = db.cursor() data = [("零基础学Python", "python", "100.20", "2018-5-20"), ("Python入门到实践", "python", "112.20", "2019-5-30"), ("零基C语言入门", "C", "17.20", "2017-5-22"), ("快来一起学java", "JAVA", "0.20", "2018-6-20"), ("学PHP", "php", "100.20", "2018-5-20")] try: cursor.executemany("insert into books(name,category,price,publish_time) values (%s,%s,%s,%s)", data) # cursor.executemany("insert into books(name) values (%s)", "lixing") db.commit() except: db.rollback() db.close() print("你最牛逼") def order(self): if self.rb_priceasc.isChecked(): self.sqltext = "select * from books order by price ASC" print("价格升序") self.DB_dis() if self.rb_priced.isChecked(): self.sqltext = "select * from books order by price DESC" print("价格降序") self.DB_dis() if self.rb_publish.isChecked(): self.sqltext = "" self.sqltext = "select * from books order by publish_time DESC " print(self.sqltext) self.DB_dis() def DB_dis(self): # self.sqltext = "select * from books order by price DESC" sqltext=self.sqltext # print(sqltext) db = pymysql.connect(host="127.0.0.1", user="root", password="leesky2008", database="mr") cursor = db.cursor() cursor.execute(sqltext) # cursor.execute("select * from books order by publish_time desc") result=cursor.fetchall() row=cursor.rowcount vol=len(result[0]) cursor.close() db.close() self.tw_DB.setRowCount(row) self.tw_DB.setColumnCount(vol) self.tw_DB.setHorizontalHeaderLabels(['ID', '图书名称', "图书分类", "图书价格", "出版时间"]) for i in range(row): for j in range(vol): data = QTableWidgetItem(str(result[i][j])) self.tw_DB.setItem(i,j,data) self.tw_DB.resizeColumnsToContents() self.tw_DB.resizeRowsToContents() self.tw_DB.setAlternatingRowColors(True) def dengji(self): booksname = str(self.LE_bookname.text()) bookspice = str(self.LE_bookprice.text()) bookskind = str(self.CB_bookskind.currentText()) publish=QtCore.QDate(self.calendarWidget.selectedDate()) publish_time=str(publish.year())+"-"+str(publish.month())+"-"+str(publish.day()) print(booksname) print(bookspice) print(bookskind) print(publish_time) db = pymysql.connect(host="127.0.0.1", user="root", password="leesky2008", database="mr") cursor = db.cursor() datainput=[(booksname,bookskind,bookspice,publish_time)] print(datainput) try: cursor.executemany("insert into books(name,category,price,publish_time) values (%s,%s,%s,%s)", datainput) db.commit() except: db.rollback() db.close() print("你最牛逼") def search(self): self.tw_DB.clear() print("kaishi") text=str(self.LE_bookname.text()) selectsql="select * from books where name like "+"'%"+text+"%'" print(selectsql) db = pymysql.connect(host="127.0.0.1", user="root", password="leesky2008", database="mr") cursor = db.cursor() cursor.execute(selectsql) result = cursor.fetchall() if self.LE_bookname.text()=="": QMessageBox.information(self, "提示", "请输入图书名称", QMessageBox.Ok) elif cursor.rowcount > 0: row = cursor.rowcount vol = len(result[0]) print(vol) cursor.close() db.close() self.tw_DB.setRowCount(row) self.tw_DB.setColumnCount(vol) self.tw_DB.setHorizontalHeaderLabels(['ID', '图书名称', "图书分类", "图书价格", "出版时间"]) for i in range(row): for j in range(vol): data = QTableWidgetItem(str(result[i][j])) self.tw_DB.setItem(i, j, data) self.tw_DB.setItem(i, j, data) self.tw_DB.resizeColumnsToContents() self.tw_DB.resizeRowsToContents() self.tw_DB.setAlternatingRowColors(True) else: print("查无此书") QMessageBox.information(self,"提示","没有这本书",QMessageBox.Ok) import sys if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) mainWindow = MainWindow() # 实例化一个MainWindow mainWindow.show() sys.exit(app.exec_())
写在最后,需要练习以下:1、不同窗体之间的切换及数据传递
2.界面的美化设计 3.数据库的基本操作强化------视图功能和聚类
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。