使用三个.py文件。分别为zhu.py, ci_one.py, ci_two.py。
基本思路:
运行zhu.py产生一个窗口,窗口内有一个按键。按下后,打开其他两个文件产生的窗口。
先打开QT designed图形窗口设计器。设计好窗口。
最简单的设计器窗口转.py文件。
窗口:
.py文件代码:(setupUi方法用于初始化窗口)
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow): # 初始化方法--初始化窗口设置
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1000, 600) # 窗口大小
# 子窗口--添加控件
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget") # 绑定属性
MainWindow.setCentralWidget(self.centralwidget)
# 菜单栏
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 26)) # 菜单栏位置和大小
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", "标题栏"))
启动的主程序为:
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow() # 创建窗体类对象MainWindow
ui = Ui_MainWindow() # 创建PyQT设计的窗体对象
ui.setupUi(MainWindow) # 初始化MainWindow窗口设置
MainWindow.show() # 显示窗口
sys.exit(app.exec_())
1. 改变zhu.py
在zhu.py中,设置一个新的方法:click_open()。
def open(self):
import ci_one, ci_two
self.one = ci_one.Ui_MainWindow() # 初始化ci_one.py的窗口设置
self.one.show() # 显示该窗口
self.two = ci_two.Ui_MainWindow()
self.two.show()
然后对zhu.py的按钮,绑定该方法!
self.pushButton = QtWidgets.QPushButton(self.centralwidget) # 设置父窗口
self.pushButton.setGeometry(QtCore.QRect(200, 150, 93, 28)) # 设置按钮位置和大小
# 前两个参数为位置,后两个参数为大小
self.pushButton.setObjectName("pushButton") # 绑定控件类型
self.pushButton.clicked.connect(self.open) # (绑定)调用open实例方法--用来打开其他窗口
2. 改变其他的.py文件
用Qt的图形窗口设计器转换过来的.py文件都会有Ui_MainWindow类。
class Ui_MainWindow(object):
我们需要修改,让他继承QtWidgets.QMainWindow类。
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow
class Ui_MainWindow(QMainWindow):
但只是继承的话,虽然已经可以显示窗口,窗口没有任何东西,并没有接受我们的初始化。
所以还需要进行一点改动。
继承并改动它的构造方法__init__()
def __init__(self): # 构造方法
super().__init__() # 继承XX类的构造方法
self.setupUi(self) # 初始化本窗口
说明完毕。
直接上代码:
zhu.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(550, 400)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(200, 150, 93, 28))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 550, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.pushButton.clicked.connect(self.open) # 调用open实例方法--用来打开其他窗口
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "打开其他窗口"))
def open(self):
import ci_one, ci_two
self.one = ci_one.Ui_MainWindow()
self.one.show()
self.two = ci_two.Ui_MainWindow()
self.two.show()
import sys
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow() # 创建窗体类对象--窗口类型对象
ui = Ui_MainWindow() # 创建PyQT设计的窗体对象--该类用于初始化任何类型的窗口设置
ui.setupUi(MainWindow) # 初始化MainWindow窗口设置
MainWindow.show() # 显示窗口
sys.exit(app.exec_())
ci_one.py:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow
class Ui_MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(550, 400)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 550, 26))
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", "MainWindow1"))
ci_two.py
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow
class Ui_MainWindow(QMainWindow): # 本来class Ui_MainWindow的实例是不能随意使用的,但因为继承了,就可以使用了
def __init__(self):
super(Ui_MainWindow, self).__init__()
# super().__init__()
self.setupUi(self)
print(type(self))
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(550, 400)
self.centralwidget = QtWidgets.QWidget(MainWindow) # 给Qwidget设置父窗口
self.centralwidget.setObjectName("centralwidget")
self.pushButton1 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton1.setGeometry(QtCore.QRect(120, 80, 93, 28)) # 前两个参数是位置,后两个参数是按钮大小
self.pushButton1.setObjectName("pushButton")
self.pushButton2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton2.setGeometry(QtCore.QRect(120, 130, 93, 28))
self.pushButton2.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 550, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.pushButton2.clicked.connect(MainWindow.close)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow2"))
self.pushButton1.setText(_translate("MainWindow", "ci-2"))
self.pushButton2.setText(_translate("MainWindow", "退出"))
窗口演示:
点击“打开其他窗口”按钮后