Skip to content Skip to sidebar Skip to footer

Having Trouble Opening Multiple Windows In Pyqt5

I'm using PyQt5 designer to make a little application. I mostly work with designer rather than building from scratch so this might be a silly question. Basically i have a main menu

Solution 1:

The problem is simple, we are overwriting an attribute and at that moment the previous element is deleted, for that reason only a window. As you point out the solution is to store it in a list.

But before that, I recommend you not to write your logic in the .py generated by Qt Designer since for example let's say that you want to modify something of the design, then when generating the new .py it will erase all your logic. What PyQt recommends is to use create another file where you generate the logic adviritiendote with the message: # WARNING! All changes made in this file will be lost!. So restore the previous files I called bookPopup.py and mainmenu.py by removing the openNewBook. Following the docs recommendation we obtain the following:

main.py

from PyQt5 import QtCore, QtGui, QtWidgets

import bookPopout
import mainmenu


classBookPopoutWindow(QtWidgets.QMainWindow, bookPopout.BookPopout):
    def__init__(self, parent=None):
        super(BookPopoutWindow, self).__init__(parent)
        self.setupUi(self)


classMainMenu(QtWidgets.QMainWindow, mainmenu.Ui_MainWindow):
    def__init__(self, parent=None):
        super(MainMenu, self).__init__(parent)
        self.setupUi(self)
        self.createNewBookButton.clicked.connect(self.openNewBook)
        self.popups = []

    @QtCore.pyqtSlot()defopenNewBook(self):
        popWin = BookPopoutWindow()
        popWin.show()
        self.popups.append(popWin)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainMenu()
    w.show()
    sys.exit(app.exec_())

Solution 2:

PyQt5 Opening Multiple Windows/Widgets and Closing them

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QAction
import random


class Widget2(QWidget):
    def __init__(self):
        super().__init__()
        w2btn = QPushButton('Another Widget ' +
                            str(random.randrange(5, 100, 5)), self)
        w2btn.clicked.connect(self.w2btnclicked)
        w2btn.resize(w2btn.sizeHint())
        w2btn.move(50, 50)
        
    def w2btnclicked(self):
        print("Widget 2 btn clicked")
class Widget1(QWidget):

    def __init__(self):
        super().__init__()
        self.start = 50
        self.end = 50
        quit = QAction("Quit", self)
        quit.triggered.connect(self.close)
                
        addbtn = QPushButton('Add Window', self)
        addbtn.clicked.connect(self.addbtnclicked)
        addbtn.resize(addbtn.sizeHint())
        addbtn.move(50, 50)

        quitbtn = QPushButton('Quit', self)
        quitbtn.clicked.connect(QApplication.instance().quit)
        quitbtn.resize(quitbtn.sizeHint())
        quitbtn.move(50, 100)        
        self.popups = []
        
    def addbtnclicked(self):        
        print("Add Button Clicked!!")
        wdgt2 = Widget2()
        wdgt2.show()
        
        if self.start > 1600:
            self.start = 50
            self.end = self.end + 250
        wdgt2.setGeometry(self.start, self.end, 200, 200)
        self.popups.append(wdgt2)
        self.start = self.start + 250
    
    def closeEvent(self, event):
        print("In Close Event")
        QApplication.closeAllWindows()

def main():
    app = QApplication(sys.argv)
    ex = Widget1()
    ex.show()
    ex.setGeometry(800, 600, 200, 200)
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Post a Comment for "Having Trouble Opening Multiple Windows In Pyqt5"