目录
前言
用pyqt5写一个像Mysql Workbench或者navicat
比较长,慢慢来
配置环境
1 pip install pyqt5
2 MYSQL安装
3 使用ODBC
4 pyqt5 的环境配置(Qt desigener, PyUic,Pyrcc)(网上有,不说)(0x0)
说明
ODBC
原因
因为我无法直接使用Pyqt5 中的驱动器
from PyQt5.QtSql import QSqlDatabase
print(QSqlDatabase.drivers())
结果
['QSQLITE', 'QODBC', 'QODBC3', 'QPSQL', 'QPSQL7']
没有QMYSQL
网上搜了搜也没有成功,哎!!!!
不知道怎么办,求大佬教
(0.0)(0.0)(0.0)(0.0)
只能推而求其次,ODBC连接
连接ODBC
1 打开cmd
2 输入odbcab32
3 按enter
4 结果
5 点击添加
6 选择如图
后面不用说了。
正文
1 登录页面
长这样的,看一眼就知道,控件很简单,图标可以直接找。不说了。
1.1 登录的主页面
from login_mysql import Ui_Form
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtSql import *
from mian import Main
import sys
class myput(QMainWindow,Ui_Form):
def __init__(self):
super().__init__()
self.main = None
self.db = None
self.setupUi(self)
self.setFixedSize(self.width(), self.height())
# 登录事件
@pyqtSlot()
def on_login_clicked(self):
user=self.user_line.text()
password=self.password.text()
self.db=self.__open(user,password)
if self.db.open():
# 登录成功,调用主函数
self.main=Main(self.db)
self.main.show()
self.close()
# 注册功能还没写
@pyqtSlot()
def on_registers_clicked(self):
pass
# 取消按钮
@pyqtSlot()
def on_loser_clicked(self):
self.close()
# 绘画事件,添加背景图片
def paintEvent(self, a0: QPaintEvent) -> None:
paint=QPainter(self)
pixmap=QPixmap(':/img/image/29.jpg')
paint.drawPixmap(self.rect(),pixmap)
# 根据ODBC的登录
def __open(self,root,password):
db = QSqlDatabase.addDatabase('QODBC')
db.setHostName('localhost') # 主机名
db.setPort(3306)
db.setDatabaseName('only') # 我在odbc的命名,不是数据库
db.setUserName(root)
db.setPassword(password)
return db
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyle(QStyleFactory.create('Fusion'))
a = myput()
a.show()
sys.exit(app.exec_())
1.2 结果
耶!!!!!
2 主页面
没有设计完成
慢慢来
目前长这样的
左边的QtreeWidget,中间的TreeVire。右边有两个控件,没设计完
但实现了在QQtreeWidget读取数据库及表和展示在treeview中,其他增删改查,还不行
2.1代码
from Mains import Ui_MainWindow
from link import Link
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtSql import *
import sys
class Main(QMainWindow,Ui_MainWindow):
def __init__(self,db):
super().__init__()
self.selModel = None
self.qrymodel = None
self.db=db
self.all_dabase=[]
self.tables={}
self.setupUi(self)
self.__init_db()
self.__init_table()
self.__init_list()
def __init_list(self):
database=self.all_dabase
db_icon = QIcon(':/img/image/databases.png')
tables_icon = QIcon(':/img/image/tables.png')
for t in database:
item=QTreeWidgetItem()
item.setIcon(0,db_icon)
item.setText(0,t)
tables_item = QTreeWidgetItem()
tables_item.setIcon(0, tables_icon)
tables_item.setText(0, '表')
table=self.get_table(t)
tables_item.addChildren(table)
item.addChild(tables_item)
self.treeWidget.addTopLevelItem(item)
self.treeWidget.itemDoubleClicked.connect(self.show_table)
def get_table(self,db):
table_icon = QIcon(':/img/image/table.png')
table=[]
for i in self.tables[db]:
table_item = QTreeWidgetItem()
table_item.setIcon(0, table_icon)
table_item.setText(0, i)
table.append(table_item)
return table
def show_table(self,item:QTreeWidgetItem,column):
if item.childCount()==0:
table_name=item.text(0)
db=item.parent().parent().text(0)
self.get_data(db,table_name)
else:
pass
# 得到数据库
def __init_db(self):
if self.db.open():
query = QSqlQuery()
query.exec_("show databases")
while query.next():
self.all_dabase.append(query.value(0))
else:
return None
# 得到表
def __init_table(self):
db=self.all_dabase
for i in db:
table = []
if self.db.open():
query = QSqlQuery()
str=f'show tables from {i}'
query.exec_(str)
while query.next():
table.append(query.value(0))
self.tables[i]=table
else:
return None
# 是通过sql语句得到所有的数据库和表。。
def get_data(self,db,table):
self.qrymodel = QSqlQueryModel(self)
self.qrymodel.setQuery(f'use {db};')
self.qrymodel.setQuery(f'desc {table}')
word=[]
row_count=self.qrymodel.rowCount()
for i in range(row_count):
word.append(self.qrymodel.record(i).value(0))
self.qrymodel.setQuery(f'select * from {table};')
if self.qrymodel.lastError().isValid():
QMessageBox.critical(self, '出错消息', '打开数据表错误,出错消息\n' + self.qrymodel.lastError().text())
return
for i in range(row_count):
self.qrymodel.setHeaderData(i, Qt.Horizontal, word[i])
self.selModel = QItemSelectionModel(self.qrymodel)
self.tableView.setModel(self.qrymodel)
self.tableView.setSelectionModel(self.selModel)
# 绘画事件
def paintEvent(self, a0: QPaintEvent) -> None:
paint=QPainter(self)
pixmap=QPixmap(':/img/image/preview.jpg')
paint.drawPixmap(self.rect(),pixmap)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyle(QStyleFactory.create('Fusion'))
a = Main()
a.show()
sys.exit(app.exec_())
2.2结果
没写完,先这样把
总结
这样写感觉电脑好烫,而且比较麻烦。
继续写。