端口映射+物理机、虚拟机互访+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_())

猜你喜欢

转载自blog.csdn.net/qq_57663276/article/details/128258618