pyqt5 写一个属于自己的Mysql Workbench(一)

目录

前言

配置环境

说明

ODBC 

原因

1 打开cmd

2 输入odbcab32

3 按enter

4 结果

5 点击添加

6 选择如图

正文

1 登录页面

1.1 登录的主页面

1.2 结果

2 主页面

2.1代码

2.2结果

总结


前言

 用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结果

没写完,先这样把

总结

这样写感觉电脑好烫,而且比较麻烦。

继续写。

猜你喜欢

转载自blog.csdn.net/qq_63401240/article/details/131557806