Некорректно работает переход на новое окно в PyQt5

Рейтинг: 1Ответов: 1Опубликовано: 13.04.2023

Есть окно_1 и окно_2. Пользователь может перейти из окно_1 в окно_2 и наоборот, нажав на кнопку.

Проблема в том, что если перейти в окно_2, а затем вернуться в окно_1 и попробовать снова перейти в окно_2, выдаст такую ошибку:

NameError: name 'SecondWin' is not defined

Пример кода окон:

window1.py

from window2 import *
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout


class FirstWin(QWidget):
    def __init__(self):
        super().__init__()
        self.UI()
        self.UX()
        self.connections()

    def UI(self):
        self.setFixedSize(500, 300)
        self.move(400, 300)

    def UX(self):
        self.next_button = QPushButton('Следующее окно')
        self.line = QHBoxLayout()
        self.line.addWidget(self.next_button, alignment=Qt.AlignCenter)
        self.setLayout(self.line)

    def connections(self):
        self.next_button.clicked.connect(self.next)

    def next(self):
        self.hide()
        self.w2 = SecondWin()
        self.w2.show()


if __name__ == '__main__':
    app = QApplication([])
    w1 = FirstWin()
    w1.show()
    app.exec_()

window2.py

from window1 import *
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QPushButton, QHBoxLayout


class SecondWin(QWidget):
    def __init__(self):
        super().__init__()
        self.UI()
        self.UX()
        self.connections()

    def UI(self):
        self.setFixedSize(500, 300)
        self.move(400, 300)

    def UX(self):
        self.next_button = QPushButton('Назад')
        self.line = QHBoxLayout()
        self.line.addWidget(self.next_button, alignment=Qt.AlignCenter)
        self.setLayout(self.line)

    def connections(self):
        self.next_button.clicked.connect(self.next)

    def next(self):
        self.hide()
        self.w1 = FirstWin()
        self.w1.show()

Ответы

▲ 1Принят

Вам не надо в модуле window2.py создавать новые экземпляр self.w1 = FirstWin()

Как вариант:

q1513050_window1.py

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout

from q1513050_window2 import SecondWin

class FirstWin(QWidget):
    def __init__(self):
        super().__init__()

        self.next_button = QPushButton('Открыть второе окно.')
        self.next_button.clicked.connect(self.next)
        
        self.layout = QHBoxLayout(self)
        self.layout.addWidget(self.next_button, alignment=Qt.AlignCenter)

        self.w2 = SecondWin(self)                               # !!! +++ self
        self.w2.setWindowTitle('Second Window')

    def next(self):
        self.w2.show()
        self.hide()
#        self.w2 = SecondWin()


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w1 = FirstWin()
    w1.setWindowTitle('First Window')  
    w1.resize(500, 300)
    w1.show()
    sys.exit(app.exec_())

q1513050_window2.py

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, \
    QVBoxLayout, QPushButton, QHBoxLayout

#from q1513050_window1 import *                                 # НЕТ


class SecondWin(QWidget):
    def __init__(self, parent):                            # !!! +++ parent
        super().__init__() 
        
        self.parent = parent                               # !!! +++ parent
        
        self.UI()
        self.UX()
        self.connections()

    def UI(self):
        self.setFixedSize(500, 300)
        self.move(400, 300)

    def UX(self):
        self.next_button = QPushButton('Открыть ПЕРВОЕ окно.')
        self.line = QHBoxLayout()
        self.line.addWidget(self.next_button, alignment=Qt.AlignCenter)
        self.setLayout(self.line)

    def connections(self):
        self.next_button.clicked.connect(self.next)

    def next(self):
        self.hide()
#        self.w1 = FirstWin()
#        self.w1.show()
        self.parent.show()                                        # !!! +++

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

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