软硬件环境
- Windows 10 64bit
- Anaconda3 with python 3.8
- PyQt5 5.15
简介
实际项目中,多窗口是个非常常见的操作,本篇就来看看 PyQt5 中多窗口的实现。
实例
我们做2个窗口,主窗口中有个按钮,点击按钮后跳出第二个窗口
界面通过 designer 来设计,分别是这样的

第二个窗口中放一个 label,加上点文字

界面完成后,得到 ui 文件,通过 pyuic5.bat 将 ui 转换成 py 文件,命令是这样的
pyuic5.bat -o ui_mainwindow.py mainwindow.ui
pyuic5.bat -o ui_secondwindow.py .secondwindow.ui
接下来编写2个窗口对应的文件代码,主窗口是 main_window.py
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from ui_mainwindow import Ui_MainWindow
from second_window import SecondWindow
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
# 按钮点击处理
self.pushButton.clicked.connect(self.showSecondWindow)
def showSecondWindow(self):
# 实例化第二个窗口,然后进行show,这里保留主窗口的显示。
self.secWin = SecondWindow()
# 窗口的关闭调用self.secWin.close()方法
self.secWin.show()
if __name__ == '__main__':
# 常规的app启动步骤
app = QApplication(sys.argv)
windows = MainWindow()
windows.show()
sys.exit(app.exec_())
第二个窗口 second_window.py 就很简单了,显示出来就行
from PyQt5.QtWidgets import QMainWindow
from ui_secondwindow import Ui_MainWindow
class SecondWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(SecondWindow, self).__init__(parent)
self.setupUi(self)
运行 main_window.py,可以看到

通常,在打开新窗口时,都会传递一些值过去,针对这种情况,我们也来看个实例
修改 second_window.py 的构造函数,加入参数接收一个字符串,然后将字符串显示在 label 控件上
def __init__(self, param, parent=None):
super(SecondWindow, self).__init__(parent)
self.setupUi(self)
print("从主窗口传递过来的字符是:{}".format(param))
self.label.setText(param)
回到 main_window.py 中调用的地方,实例化时带上要传递的字符串参数,其它数据类型也是类似
def showSecondWindow(self):
self.secWin = SecondWindow("Hello SecondWindow.")
self.secWin.show()
最后的执行结果是这样的

源码下载
https://github.com/xugaoxiang/learningPyQt5
PyQt5系列教程
更多 PyQt5 教程,请移步