Search code examples
pythonpyqtpyqt5

Multiple windows in pyqt5


This algorithm allows a new window to be opened each time a button is clicked, but when it is clicked again the window closes, I need to modify it in such a way that clicking it generates a new window each time without being close the previous one.

Code:

import sys
from random import randint

from PyQt5.QtWidgets import (
    QApplication,
    QLabel,
    QMainWindow,
    QPushButton,
    QVBoxLayout,
    QWidget,
)


class AnotherWindow(QWidget):
    """
    This "window" is a QWidget. If it has no parent,
    it will appear as a free-floating window.
    """

    def __init__(self):
        super().__init__()
        layout = QVBoxLayout()
        self.label = QLabel("Another Window % d" % randint(0, 100))
        layout.addWidget(self.label)
        self.setLayout(layout)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.window1 = AnotherWindow()
        self.window2 = AnotherWindow()

        l = QVBoxLayout()
        button1 = QPushButton("Push for Window 1")
        button1.clicked.connect(self.toggle_window1)
        l.addWidget(button1)

        button2 = QPushButton("Push for Window 2")
        button2.clicked.connect(self.toggle_window2)
        l.addWidget(button2)

        w = QWidget()
        w.setLayout(l)
        self.setCentralWidget(w)

    def toggle_window1(self, checked):
        if self.window1.isVisible():
            self.window1.hide()

        else:
            self.window1.show()

    def toggle_window2(self, checked):
        if self.window2.isVisible():
            self.window2.hide()

        else:
            self.window2.show()


app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()

I have tried changing the windows variable for a new widget each time the button is given but it doesn't work


Solution

  • Your code is generating three windows and is using the buttons in the MainWindow to hide/show the other two windows. To generate new windows on button press, you need to call new instances of AnotherWindow and store them in MainWindow.

    For example:

    import sys
    from random import randint
    
    from PyQt5.QtWidgets import (
        QApplication,
        QLabel,
        QMainWindow,
        QPushButton,
        QVBoxLayout,
        QWidget,
    )
    
    
    class AnotherWindow(QWidget):
        """
        This "window" is a QWidget. If it has no parent,
        it will appear as a free-floating window.
        """
    
        def __init__(self):
            super().__init__()
            layout = QVBoxLayout()
            self.label = QLabel("Another Window % d" % randint(0, 100))
            layout.addWidget(self.label)
            self.setLayout(layout)
    
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
            self.windows = []
    
            l = QVBoxLayout()
            button1 = QPushButton("Push for new window")
            button1.clicked.connect(self.open_newWindow)
            l.addWidget(button1)
    
            w = QWidget()
            w.setLayout(l)
            self.setCentralWidget(w)
    
        def open_newWindow(self):
            window = AnotherWindow()
            self.windows.append(window)
            window.show()
    
    
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exec_()