Некорректно работает переход на новое окно в PyQt5
Есть окно_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 шт):
Автор решения: S. Nick
→ Ссылка
Вам не надо в модуле 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() # !!! +++

