Как передать переменную в дочернее окно?
Помогите, пожалуйста, с решением данной задачи (суть максимально упростил).
Требуется следующее:
- По кнопке в главном окне присваивается значение некоторой переменной и открывается второе окно.
- Необходимо, чтобы у второго окна был доступ к этой переменной (в
данном случае у закомментированной строки
print(a)).
Подскажите, пожалуйста, как передать переменную a из класса Window() в класс Window_303()?
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget
class Window_303(QWidget):
def __init__(self, parent=None):
super().__init__()
self.parent = parent
#print(a)
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.w = Window_303()
button = QPushButton("Открыть окно", self)
button.show()
button.clicked.connect(lambda: self.button_actions())
self.show()
def button_actions(self):
a = 2
self.show_window_303(self)
def show_window_303(self, checked):
self.w.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = Window()
main_window.resize(200, 200)
main_window.show()
sys.exit(app.exec())
Ответы (2 шт):
Автор решения: Альберт
→ Ссылка
Решение:
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget
class Window_303(QWidget):
def __init__(self, a, parent=None):
super().__init__()
self.parent = parent
print(a)
class Window(QMainWindow):
def __init__(self):
super().__init__()
button = QPushButton("Открыть окно", self)
button.show()
button.clicked.connect(lambda: self.button_actions())
self.show()
def button_actions(self):
a = 2
self.show_window_303(self, a)
def show_window_303(self, checked, a):
self.w = Window_303(a)
self.w.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = Window()
main_window.resize(200, 200)
main_window.show()
sys.exit(app.exec())
Автор решения: S. Nick
→ Ссылка
Структура главного окна QMainWindow:
Научитесь использовать менеджеры компоновки:
Не используйте lambda, там где ее не надо использовать.
Поменяйте импорты и проверьте. Улучшенный вариант, выглядит так:
import sys
'''
from PyQt6.QtWidgets import QApplication, QMainWindow, \
QPushButton, QWidget, QLabel, QVBoxLayout, QLineEdit
'''
from PyQt5.Qt import *
class Window_303(QWidget):
def __init__(self, parent=None):
super().__init__()
self.resize(300, 400)
self.parent = parent
self.label = QLabel(self, alignment=Qt.AlignCenter)
self.label.setWordWrap(True)
self.label.setStyleSheet("""
QLabel {
color: rgb(253, 253, 253);
background-color: #105652;
font-size: 33px;
}
""")
layout = QVBoxLayout(self)
layout.addWidget(self.label)
def show_values_a(self): # !!! так будет правильнее
print(f'values_a = {self.parent.values_a}') #
self.label.setText(self.parent.values_a)
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget = QWidget() # +
self.setCentralWidget(self.centralWidget) # +
self.values_a = None # +
self.lineEdit = QLineEdit(placeholderText="Введите значение для переменной values_a")
self.button = QPushButton("Открыть окно", self)
# ? button.show()
# ---------------------------------> vvvvvvv <----------------> vv <--------- ???
# self.button.clicked.connect(lambda: self.button_actions())
self.button.clicked.connect(self.button_actions)
# ? self.show()
main_layout = QVBoxLayout(self.centralWidget) # +
main_layout.addWidget(self.lineEdit)
main_layout.addWidget(self.button, alignment=Qt.AlignHCenter | Qt.AlignBottom)
self.lineEdit.setFocus()
self.window_303 = Window_303(self)
def button_actions(self):
# a = 2
self.values_a = self.lineEdit.text() # +
# self.show_window_303(self)
self.show_window_303()
# def show_window_303(self, checked):
def show_window_303(self):
self.window_303.show_values_a() # !!! +++
self.window_303.show()
def closeEvent(self, event): # +
self.window_303.close()
event.accept()
if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = Window()
main_window.resize(300, 200)
main_window.show()
sys.exit(app.exec())

