Как кнопкой вызвать другое окно в PyQt5

Мне надо, чтобы при нажатии на кнопку вызывалось второе окно.

Пробовал вот так:

   def info_win_btn(self):
        self.ui.inst.clicked.connect(lambda: self.show_info())

    @staticmethod
    def show_info():
        info = QtWidgets.QApplication([])
        window_info = Instruction()
        window_info.show()

# там еще методов много
class Instruction(QtWidgets.QMainWindow):
    def __init__(self):
        super(Instruction, self).__init__()
        self.inst_ui = inst.Ui_MainWindow()
        self.inst_ui.setupUi(self)


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    window = Application()
    window.show()
    sys.exit(app.exec_())

Вот пример чтобы попробовать:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):  # главное окно
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(220, 190, 351, 141))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        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", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Я вызываю дочернее окно"))

###
class Ui_MainWindow(object):  # окно, которое вызывается кнопкой в главном окне
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(80, 80, 651, 341))
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        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", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Я дочернее окно, или как там правильно"))


# код главный 
import frst
import scnd
import sys
from PyQt5 import QtWidgets


class Main(QtWidgets.QMainWindow):
    def __init__(self):
        super(Main, self).__init__()
        self.ui = frst.Ui_MainWindow()
        self.ui.setupUi(self)

    def call_btn(self):
        self.ui.pushButton.clicked.connect(lambda: self.call_event())

    def call_event(self):
        pass


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    application = Main()
    application.show()
    sys.exit(app.exec_())


Заранее спасибо.


Ответы (1 шт):

Автор решения: S. Nick

Попробуйте, если что-то не понятно - спросите.

main.py

import sys
from PyQt5 import QtWidgets

#                           --> vvvvvvvvvvvvv  <----
from  frst import Ui_MainWindow as FrstWindow
from  scnd import Ui_MainWindow as ScndWindow  
#                           --> ^^^^^^^^^^^^^  <----

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
class SecondWindow(QtWidgets.QMainWindow, ScndWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   
     

class Main(QtWidgets.QMainWindow, FrstWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.pushButton.clicked.connect(self.call_event)
        
        self.secondWindow = SecondWindow()                                 # !!! +++

    def call_event(self):
        self.secondWindow.show()                                           # !!! +++


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    application = Main()
    application.show()
    sys.exit(app.exec_())

frst.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):                                          # главное окно
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(220, 190, 351, 141))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        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", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Я вызываю дочернее окно"))

scnd.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):                               # окно, которое вызывается кнопкой в главном окне
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(80, 80, 651, 341))
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        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", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Я дочернее окно, или как там правильно"))

введите сюда описание изображения

→ Ссылка