端口映射+物理机、虚拟机互访+Pyqt5、Gui图形化界面+Mysql数据库

目录

一、背景

1.1、要求

1.2、说明

1.2.1、环境

二、步骤详解

2.1、在linux下安装mysql数据库,并能通过localhost/phpmyadmin登录,用户名密码均设为root

2.2、新建一个数据库命名为xxx,在数据库xxx新建table数据表t1,在表t1中新建字段n1,n2,n3,分别在字段中插入不同的数值(数字,字符,日期等类型),可自行设计一个数据库,比如你的班级学生的姓名,年龄,学号,性别等

2.3、授权远程登录,将linux下的mysql数据库的3306端口映射至windows下3307口,实现局域网中远程访问虚拟机中mysql数据库

2.4、备份数据库后,删除数据库,再恢复数据库

2.5、windows开启mysql数据库,windows linux实现互访

2.6、利用python/java/php或其它语言,控制mysql数据库的操作。(登录,删除或增加数据)

三、运行结果

3.1、登录页面

3.2、主页面

四、完整源码


一、背景

1.1、要求


1) 在linux下安装mysql数据库,并能通过localhost/phpmyadmin登录,用户名密码均设为root
2) 新建一个数据库命名为xxx,在数据库xxx新建table数据表t1,在表t1中新建字段n1,n2,n3,分别在字段中插入不同的数值(数字,字符,日期等类型),可自行设计一个数据库,比如你的班级学生的姓名,年龄,学号,性别等
3) 授权远程登录,将linux下的mysql数据库的3306端口映射至windows下3307口,实现局域网中远程访问虚拟机中mysql数据库
4) 备份数据库后,删除数据库,再恢复数据库
5) 选作项:windows开启mysql数据库,windows linux实现互访。
6) 选作项:利用python/java/php或其它语言,控制mysql数据库的操作。(登录,删除或增加数据)

1.2、说明

1.2.1、环境

物理机:windows 10

虚拟机:ubuntu 

网络连接:个人热点

数据库:mysql 8.0

界面:pyqt5

二、步骤

以下内容均需联网:

2.1、在linux下安装mysql数据库,并能通过localhost/phpmyadmin登录,用户名密码均设为root

1)安装:sudo apt-get install mysql-server(只下载,不设定密码)

2)查看密码(使用默认的root用户即可,使用不用修改用户名,修改系统给的初始密码即可):sudo cat /etc/mysql/debian.cnf-->查看系统初始账号和密码

3)本地访问:sudo mysql -u root -p (登录数据库,指定root用户,使用密码登录,这时需要输入当前操作系统用户的密码,然后要输入登录数据库的密码,使用之前查看.cnf的文件内容即可)

注意点:8.0版本的mysql数据库的字段改了,使用update修改密码会报语法错误

要先进入到mysql数据库:use mysql;

修改密码sql语句:alter user 用户名 identified by '密码';

刷新:flush privileges;

说明:若下载mysql数据库时出现报错,找不到依赖源,可以使用命令行执行更新软件源:

root@xiawoei-virtual-machine:/home# apt-get update

最后的办法:把ubuntu的操作系统删了,重新安装然后在下载(这个过程大概需要半个小时左右),在次下载就不会报错了;

2.2、新建一个数据库命名为xxx,在数据库xxx新建table数据表t1,在表t1中新建字段n1,n2,n3,分别在字段中插入不同的数值(数字,字符,日期等类型),可自行设计一个数据库,比如你的班级学生的姓名,年龄,学号,性别等

1)增

新建库:create database 数据库名称;

create database wlw ;

新建库:create database 数据库名称;

create database wlw ;

插入数据:insert into 表名(变量1,变量2,变量n) values(值1,值2,值n);

insert into t1(n1,n2,n3)  values(1,’1’,2020);

插入数据类型命令:alter table 表名 add 字段 数据类型

alter table t1 add n1 char;

2)删

删库:drop database 库名;

删表:drop table 表名;

删除表中数据命令: 如:删除表中编号为1的记录 delete from 表名 where id=1;

删除一个字段命令: alter table 表名 drop 字段名;

清空表内数据命令: delete from 表名;(数据全空)

3)改

修改表名: alter table 表名 rename to 新表名;

修改字段: alter table 表名 change 原字段名 新字段名 数据类型;

修改数据类型命令: alter table 表名 modify 字段名 新数据类型;

4)查

查表全部数据:select * from 表名;

查看相关类型数据命令: select 字段,字段 from 表名;

查看表结构:desc 表名;

2.3、授权远程登录,将linux下的mysql数据库的3306端口映射至windows下3307口,实现局域网中远程访问虚拟机中mysql数据库

1)虚拟机开启访问权限

配置虚拟机访问权限:sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 文件

找到这两行,改成这样:

bind-address            = *
mysqlx-bind-address     = *

按下Esc,:wq(保存退出)

查看是否配置成功:sudo netstat -an|gerep 3306

防火墙允许端口访问:sudo ufw allow 3306(管理员权限)

防火墙关闭:

配置数据库访问权限:先访问数据库-->sudo mysql -uroot -proot

查看mysql数据库的user表中的user,host字段

 %代表全部都可以访问;

更新访问权限命令:grant all privileges on *.* to root@"%" identified by "root" with grant option;

刷新:flush privileges;

2)物理机开启端口监听与转发

配置数据库访问权限:

1、登录mysql:mysql -u用户名 -p密码

2、切换数据库:use mysql;

3、查看权限:select user,host from user;

4、更新权限:grant all privileges on *.* to root@"%" identified by "root" with grant option;

配置端口监听:

#端口转发
netsh interface portproxy add v4tov4 listenaddress=本地IP地址 listenport=物理机端口 connectaddress=虚拟机IP地址 connectport=虚拟机端口号

#查看配置
netsh interface portproxy show v4tov4
#删除
netsh interface portproxy delete v4tov4 listenaddress=本地IP地址 listenport=物理机端口

配置成功如下:

3)关物理机和虚拟机防火墙

关linux防火墙:

命令行执行:sudo ufw enable(需要切换到root用户才行,sudo -i 然后输入当前用户的密码可以暂时进入到root用户,假如不记得root密码又不会改)

关windows防火墙:

 把出现的三个防火墙全关了;

验证端口映射的远程连接:

windows命令行连接:mysql -P端口号 -h本地地址 -u用户名 -p密码

2.4、备份数据库后,删除数据库,再恢复数据库

命令行下执行:

备份:mysqldump -u root -p 库名>保存的路径

删除:drop database 库名;

还原:mysql -u root -p 库名 < 保存的路径

2.5、windows开启mysql数据库,windows linux实现互访

1)windows创建数据库,linux创建数据库

2)linux开启3306端口,并允许访问3306端口

3)linux数据库开启访问权限

4)windows数据库开启访问权限

5)连接命令

命令行:mysql -h连接的IP -u数据库用户 -p用户密码

示例:windows要连接虚拟机的数据库,虚拟机IP为192.168.43.44,虚拟机数据库用户为root,密码为root,物理机IP为192.168.43.197(物理机与虚拟机要在同一个网段)

命令为:msyql -h192.168.43.44 -uroot -proot

2.6、利用python/java/php或其它语言,控制mysql数据库的操作。(登录,删除或增加数据)

完整代码放在最后。

三、运行结果

3.1、登录页面

3.2、主页面

四、完整源码

import pymysql
import time

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtGui import QPixmap,QIcon
import sys



from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow


class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setStyleSheet("background-image: url(./3.jpg);")
        self.centralwidget.setObjectName("centralwidget")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(0, 0, 341, 351))
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(2)
        self.tableWidget.setRowCount(7)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(4, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(5, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(6, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setItem(0, 0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setItem(0, 1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setItem(1, 0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setItem(1, 1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setItem(2, 0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setItem(2, 1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setItem(3, 0, item)

        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(460, 290, 101, 51))

        self.pushButton.setObjectName("pushButton")

        self.tableWidget_2 = QtWidgets.QTableWidget(self.centralwidget)

        self.tableWidget_2.setGeometry(QtCore.QRect(10, 360, 331, 121))

        self.tableWidget_2.setObjectName("tableWidget_2")

        self.tableWidget_2.setColumnCount(2)

        self.tableWidget_2.setRowCount(1)

        item = QtWidgets.QTableWidgetItem()

        self.tableWidget_2.setVerticalHeaderItem(0, item)

        item = QtWidgets.QTableWidgetItem()

        self.tableWidget_2.setHorizontalHeaderItem(0, item)

        item = QtWidgets.QTableWidgetItem()

        self.tableWidget_2.setHorizontalHeaderItem(1, item)

        item = QtWidgets.QTableWidgetItem()

        self.tableWidget_2.setItem(0, 0, item)

        item = QtWidgets.QTableWidgetItem()

        self.tableWidget_2.setItem(0, 1, item)

        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)

        self.pushButton_2.setGeometry(QtCore.QRect(460, 360, 101, 61))

        self.pushButton_2.setObjectName("pushButton_2")

        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)

        self.pushButton_3.setGeometry(QtCore.QRect(460, 220, 101, 51))

        self.pushButton_3.setObjectName("pushButton_3")

        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)

        self.pushButton_4.setGeometry(QtCore.QRect(460, 440, 101, 61))

        self.pushButton_4.setObjectName("pushButton_4")

        self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)

        self.pushButton_5.setGeometry(QtCore.QRect(460, 120, 91, 61))

        self.pushButton_5.setObjectName("pushButton_5")

        MainWindow.setCentralWidget(self.centralwidget)

        self.menubar = QtWidgets.QMenuBar(MainWindow)

        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))

        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", "主界面"))

        item = self.tableWidget.verticalHeaderItem(0)

        item.setText(_translate("MainWindow", "1"))

        item = self.tableWidget.verticalHeaderItem(1)

        item.setText(_translate("MainWindow", "2"))

        item = self.tableWidget.verticalHeaderItem(2)

        item.setText(_translate("MainWindow", "3"))

        item = self.tableWidget.verticalHeaderItem(3)

        item.setText(_translate("MainWindow", "4"))

        item = self.tableWidget.verticalHeaderItem(4)

        item.setText(_translate("MainWindow", "5"))

        item = self.tableWidget.verticalHeaderItem(5)

        item.setText(_translate("MainWindow", "6"))

        item = self.tableWidget.verticalHeaderItem(6)

        item.setText(_translate("MainWindow", "7"))

        item = self.tableWidget.horizontalHeaderItem(0)

        item.setText(_translate("MainWindow", "id"))

        item = self.tableWidget.horizontalHeaderItem(1)

        item.setText(_translate("MainWindow", "name"))

        __sortingEnabled = self.tableWidget.isSortingEnabled()

        self.tableWidget.setSortingEnabled(False)

        self.tableWidget.setSortingEnabled(__sortingEnabled)

        self.pushButton.setText(_translate("MainWindow", "添加数据"))

        item = self.tableWidget_2.verticalHeaderItem(0)

        item.setText(_translate("MainWindow", "1"))

        item = self.tableWidget_2.horizontalHeaderItem(0)

        item.setText(_translate("MainWindow", "id"))

        item = self.tableWidget_2.horizontalHeaderItem(1)

        item.setText(_translate("MainWindow", "name"))

        __sortingEnabled = self.tableWidget_2.isSortingEnabled()

        self.tableWidget_2.setSortingEnabled(False)

        self.tableWidget_2.setSortingEnabled(__sortingEnabled)

        self.pushButton_2.setText(_translate("MainWindow", "显示数据"))

        self.pushButton_3.setText(_translate("MainWindow", "删除数据"))

        self.pushButton_4.setText(_translate("MainWindow", " 修改数据"))

        self.pushButton_5.setText(_translate("MainWindow", "清空页面"))

        self.pushButton.clicked.connect(self.add)  # 添加

        self.pushButton_2.clicked.connect(self.show)  # 显示

        self.pushButton_3.clicked.connect(self.delete)  # 删除

        self.pushButton_4.clicked.connect(self.modify)  # 修改

        self.pushButton_5.clicked.connect(self.clear)  # 清空

# 添加函数
    def add(self):
        conn = pymysql.connect(
            host='127.0.0.1',
            user='root',
            password='root',
            port=3309,
            db='wlw',
            cursorclass=pymysql.cursors.DictCursor)

        cur = conn.cursor()
        print("进入成功1")
        id = self.tableWidget_2.item(0, 0).text()

        # 将输入用的表的第0行第0列的所输入在上面的数据赋值给id变量(计算机默认从0开始)

        name = self.tableWidget_2.item(0, 1).text()  # 将第0行第1列所输入的数据赋值给name

        sql = "INSERT INTO t1 (id,name) VALUES ('{}','{}')".format(id, name)

        # insert into添加的数据即为赋值后id和name的值

        cur.execute(sql)  # 执行SQL语句

        conn.commit()  # 即connection.commit,上传有效数据

        self.clear()  # 执行自定义的清空函数

        # self.show()  # 执行自定义的显示当前数据库数据的函数

    # show显示函数

    def show(self):
        conn = pymysql.connect(
            host='127.0.0.1',
            user='root',
            password='root',
            port=3309,
            db='wlw',
            cursorclass=pymysql.cursors.DictCursor)

        cur = conn.cursor()
        print("进入成功2")

        sql = "select * from t1"
        cur.execute(sql)

        data = cur.fetchall()  # 获取到的数据以元组的形式赋值给data
        print(data)    # 查看数据是什么类型
        list_data = []  # 存id和name值
        all_id = [0, 0, 0, 0]  # 接收id
        all_name = [0, 0, 0, 0]  # 接收name
        # 接收到的数据长度(返回的数据是键值对)是多少就执行多少次,提取多少次
        for x in range(0, len(data)):
            all_id[x] = data[x].get('id')  # data[x]获取每一个键值对,获取后提取每一个键值对的id值
            all_name[x] = data[x].get('name')  # 同上逻辑
            list_data.append(all_id[x])    # 把数据添加到一个元组,分别操作数据
            time.sleep(0.3)                # 延时有没有无所谓
            list_data.append(all_name[x])
        print(list_data)   # 输出数据,查看是否符合
        num_id = 0
        num_name = 1
        for i in range(len(data)):  # 遍历
            # for j in range(len(data[i])):
            for j in range(2):
                # 设置id
                if j == 0:
                    one_item = QtWidgets.QTableWidgetItem(str(list_data[num_id]))
                    num_id += 2
                    self.tableWidget.setItem(i, j, one_item)
                # 设置name
                else:
                    two_item = QtWidgets.QTableWidgetItem(str(list_data[num_name]))
                    num_name += 2
                    self.tableWidget.setItem(i, j, two_item)

                # item = QtWidgets.QTableWidgetItem(str(data[i][j]))
                # self.tableWidget.insertRow(int(self.tableWidget.rowCount()))
                # self.tableWidget.setItem(i, j, item)
                # for的嵌套循环,依次在表的每个格中输出数据
           
    def delete(self):
        conn = pymysql.connect(
            host='127.0.0.1',
            user='root',
            password='root',
            port=3309,
            db='wlw',
            cursorclass=pymysql.cursors.DictCursor)
        cur = conn.cursor()
        print("进入成功3")
        id = self.tableWidget_2.item(0, 0).text()  # 只输入需删除行的id值即可

        sql = "delete from t1 where id=" + id  # 删除work1表中指定id的列

        cur.execute(sql)

        conn.commit()

        self.clear()

        # self.show()  # 自动更新,清空后全显

    def modify(self):
        conn = pymysql.connect(
            host='127.0.0.1',
            user='root',
            password='root',
            port=3309,
            db='wlw',
            cursorclass=pymysql.cursors.DictCursor
        )
        print("进入成功4")
        cur = conn.cursor()

        id = self.tableWidget_2.item(0, 0).text()

        name = self.tableWidget_2.item(0, 1).text()

        sql = "update t1 set name=" + name + " where id=" + id  # 修改指定id的那一行的name列的值

        cur.execute(sql)

        conn.commit()

        self.clear()

        # self.show()

    def clear(self):

        self.tableWidget.clear()  # 清空第一个表格的数据

        self.tableWidget_2.clear()  # 清空第二个表格的数据


class Ui_MainWindow2(object):
    def setupUi(self, MainWindow2):
        MainWindow2.setObjectName("登录界面")
        MainWindow2.resize(708, 761)
        MainWindow2.setStyleSheet("")
        self.centralwidget = QtWidgets.QWidget(MainWindow2)
        self.centralwidget.setStyleSheet("background-image: url(./3.jpg);")
        self.centralwidget.setObjectName("centralwidget")


        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(540, 540, 131, 51))
        self.pushButton.setStyleSheet("font: 9pt \"造字工房悦黑体验版细体\";\n"
"image: url(:/ico/login.ico);\n"
"background-color: CornflowerBlack;\n"
"color: CornflowerBlack;")
        self.pushButton.setObjectName("pushButton")
        self.pushButton.setIcon(QIcon(QPixmap("login.ico")))

        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(540, 610, 131, 51))
        self.pushButton_2.setStyleSheet("font: 9pt \"造字工房悦黑体验版细体\";\n"
"image: url(:/ico/exit.ico);\n"
"color: CornflowerBlack\n"
"background-color: CornflowerBlack;")
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_2.setIcon(QIcon(QPixmap("exit.ico")))

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(450, 389, 51, 31))
        self.label.setStyleSheet("font: 9pt \"造字工房悦黑体验版细体\";\n"
"color: CornflowerBlack;")
        self.label.setObjectName("label")

        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(460, 440, 41, 21))
        self.label_2.setStyleSheet("font: 9pt \"造字工房悦黑体验版细体\";\n"
"color: CornflowerBlack;")
        self.label_2.setObjectName("label_2")

        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(510, 390, 181, 31))
        self.lineEdit.setStyleSheet("color: CornflowerBlack")
        self.lineEdit.setObjectName("lineEdit")

        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(510, 430, 181, 31))
        self.lineEdit_2.setStyleSheet("color: CornflowerBlack")
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)
        self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999))

        """"""
        self.radioButton = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton.setGeometry(QtCore.QRect(480, 480, 81, 19))
        self.radioButton.setStyleSheet("color: CornflowerBlack\n"
"font: 9pt \"造字工房悦黑体验版细体\";")
        self.radioButton.setObjectName("radioButton")
        self.radioButton.setChecked(True)


        MainWindow2.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow2)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 708, 26))
        self.menubar.setObjectName("menubar")
        MainWindow2.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow2)
        self.statusbar.setObjectName("statusbar")
        MainWindow2.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow2)
        self.pushButton.clicked.connect(self.login)
        self.pushButton_2.clicked.connect(MainWindow2.close)

        self.radioButton.toggled.connect(self.select)
        QtCore.QMetaObject.connectSlotsByName(MainWindow2)

        QtCore.QMetaObject.connectSlotsByName(MainWindow2)

    def one_two_ui(self):
        name = self.lineEdit.text()
        passwd = self.lineEdit_2.text()
        if str(name) == '123456' and str(passwd) == '000000':
            MainWindow.show()
        else:
            QMessageBox.information(MainWindow2, "错误", "用户名或者密码不正确")
            print(name, passwd)

    def login(self):
        name = self.lineEdit.text()
        passwd = self.lineEdit_2.text()

        if str(name) == '123456' and str(passwd) == '000000':
            MainWindow.show()
            MainWindow2.hide()
        else:

            QMessageBox.information(MainWindow2, "错误", "用户名或者密码不正确")
            print(name, passwd)

    def select(self):
        if self.radioButton.isChecked():
            QMessageBox.information(MainWindow2,"提示","您选择的是 管理员 登录",QMessageBox.Ok)

    def retranslateUi(self, MainWindow2):
        _translate = QtCore.QCoreApplication.translate
        MainWindow2.setWindowTitle(_translate("MainWindow", "登录界面"))
        self.pushButton.setText(_translate("MainWindow", "登录"))
        self.pushButton_2.setText(_translate("MainWindow", "退出"))
        self.label.setText(_translate("MainWindow", "用户名"))
        self.label_2.setText(_translate("MainWindow", "密码"))
        self.radioButton.setText(_translate("MainWindow", "管理员"))



if __name__ == '__main__':
    app2 = QtWidgets.QApplication(sys.argv)
    MainWindow2 = QtWidgets.QMainWindow()
    ui2 = Ui_MainWindow2()
    ui2.setupUi(MainWindow2)
    MainWindow2.show()

    MainWindow = QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    sys.exit(app2.exec_())

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyQt5是一个基于Qt的Python GUI开发框架,提供了丰富的GUI组件和工具库,MySQL是一个广泛应用的关系型数据库管理系统。PyQt5MySQL结合起来可以实现MySQL数据库的可视化操作界面。 在实现PyQt5 MySQL界面化的过程中,我们可以采用一些常用的工具库,例如PyMySQL和QSqlTableModel。PyMySQL是一个用于PythonMySQL数据库连接库,可以实现与MySQL的交互与操作,使PyQt5能够与MySQL进行连接。而QSqlTableModel是PyQt5自带的模型类,主要用于与数据库表进行交互,这样我们就可以在PyQt5的界面上显示和编辑MySQL数据库中的数据。 在使用PyQt5MySQL进行连接和数据交互时,需要配置数据库连接信息,包括MySQL服务器IP地址、端口、用户名、密码等信息,并创建表格模型对象,使用模型对象对MySQL数据库中的表进行CRUD操作。在界面设计方面,我们可以使用PyQt5中的控件(例如QTableView、QPushButton、QLineEdit)和布局管理器(例如QHBoxLayout和QVBoxLayout)实现简单且美观的可视化操作界面。 PyQt5 MySQL界面化可以帮助我们更加方便地管理和操作MySQL数据库,具有良好的用户体验和可扩展性,可以为开发人员和企业提供更多的应用场景和商业价值。 ### 回答2: PyQt5是一个Python编程语言下的GUI(图形用户界面)工具包,其主要功能是提供创建图形交互界面的API和库。同时,MySQL是一种常用的开源关系型数据库管理系统。 如果需要将PyQt5MySQL相结合,以实现对数据库的访问和操作,可以通过使用PyMySQL库实现。这个库可以连接到MySQL数据库,并允许与MySQL服务器交互,例如执行查询、修改或删除操作。 接下来需要创建一个GUI程序,在 PyPlot 或 PyQT5 中实现界面化操作。首先需要设置连接属性,包括MySQL的用户名、密码和数据库名称等基本信息。然后需要在GUI界面中添加一些控件,例如按钮、文本框和表格等,并配置事件响应函数,以实现对MySQL数据库的操作。 例如,在PyQt5中可以使用QTableWidget创建一个表格,通过调用PyMySQL库中的函数,将查询结果填入表格中。同时,可以使用QLineEdit控件实现用户输入参数,并通过PyMySQL库将其传递给MySQL服务器。 PyQt5MySQL的结合可以实现一个强大的图形式数据库编辑器,让用户方便地浏览、管理和分析数据。 ### 回答3: PyQt5是一个Python编程语言的GUI开发框架,可以很方便的开发出跨平台的GUI应用程序。MySQL是一款免费、开源的关系型数据库管理系统,可以用来存储和管理大量的数据。将两者结合起来,可以使得用户在图形化界面下操作MySQL数据库,这就是pyqt5 mysql界面化。 在实现pyqt5 mysql界面化的过程中,需要使用到PyQt5MySQL的库。PyQt5库提供了对GUI的支持,而对于MySQL的操作,可以使用Python标准库中的MySQLdb库或者是PyMySQL库。在使用PySQL库进行MySQL的操作时,需要注意保证MySQLdb库或者PyMySQL库在Python的运行环境中安装好。 在开发界面时,可以使用PyQt5提供的Qt Designer工具,可视化的进行界面设计。在界面中可以添加按钮、文本框、表格等组件,通过PyQt5的信号槽制,将这些组件与MySQL的操作进行绑定。当用户在界面上点击按钮或者提交了查询信息时,就可以调用MySQL的操作进行数据的增删改查操作了。 在实现pyqt5 mysql界面化时,需要注意保证程序的安全性和稳定性。应该遵循最小权限原则,保证只有经过授权的用户才能进行访问数据库。对于用户输入的数据,也需要进行合法性验证和SQL注入的过滤,防止出现安全漏洞。 总之,pyqt5 mysql界面化是一个实现复杂功能的好方法。它让用户可以在一张漂亮的图形界面下操作数据库,从而提高了效率和便捷性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值