Как передать значения заполненных полей в переменную в главном классе?

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

У меня есть главное окно (класс), в котором я вызываю по клику ту или иную форму фильтра. Файл fil.py содержит в себе все эти окна в виде классов, которые, по мере необходимости, создаются и подрубаются в этот файл (чтобы не загромождать main.py).

Выбранная форма заполняется какими-либо данными, а по клику на кнопку "Применить" данные с полей должны передаться в основной файл (класс) в созданный при инициализации параметр (просто далее я с этими данными в методе провожу манипуляции.
Мне нужна возможность их потрогать). Я пытался ретёрнить окна с .super(), пересоздавать их и как-то обращаться через parent к методам/полям - не получилось...

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

main.py

import sys

from PyQt5 import QtWidgets
import main_ui
import fil  # файл с классами фильтров (разных окон)


class MainWindow(QtWidgets.QMainWindow, main_ui.Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.fil1 = fil.Filter1()
        self.fil2 = fil.Filter2()
        self.btnOpenFilter.clicked.connect(lambda: self.fil1.show())
        self.btnOpenFilter_2.clicked.connect(lambda: self.fil2.show())
        self.data = ""  # В этот параметр нужно записать данные, введённые в окнах

    def call_data(self):  # В этом методе отобразить поля, которые были заполнены
        print(self.data)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec_()

fil.py

from PyQt5 import QtWidgets
import win1
import win2


class Filter1(QtWidgets.QWidget, win1.Ui_winFilter):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.btnAccept.clicked.connect(self.close)
        self.btnCancel.clicked.connect(self.close)

    # def get_fields(self):
    #   return (self.lineEdit.text()......)


class Filter2(QtWidgets.QWidget, win2.Ui_winFilter2):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.btnAccept.clicked.connect(self.close)
        self.btnCancel.clicked.connect(self.close)

main_ui.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(443, 334)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btnOpenFilter = QtWidgets.QPushButton(self.centralwidget)
        self.btnOpenFilter.setGeometry(QtCore.QRect(90, 120, 101, 31))
        self.btnOpenFilter.setObjectName("btnOpenFilter")
        self.btnOpenFilter_2 = QtWidgets.QPushButton(self.centralwidget)
        self.btnOpenFilter_2.setGeometry(QtCore.QRect(260, 120, 101, 31))
        self.btnOpenFilter_2.setObjectName("btnOpenFilter_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 443, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.btnOpenFilter.setText(_translate("MainWindow", "Открыть фильтр1"))
        self.btnOpenFilter_2.setText(_translate("MainWindow", "Открыть фильтр2"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

win1.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_winFilter(object):
    def setupUi(self, winFilter):
        winFilter.setObjectName("winFilter")
        winFilter.resize(241, 229)
        self.lineEdit = QtWidgets.QLineEdit(winFilter)
        self.lineEdit.setGeometry(QtCore.QRect(60, 50, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.btnAccept = QtWidgets.QPushButton(winFilter)
        self.btnAccept.setGeometry(QtCore.QRect(40, 160, 75, 23))
        self.btnAccept.setObjectName("btnAccept")
        self.btnCancel = QtWidgets.QPushButton(winFilter)
        self.btnCancel.setGeometry(QtCore.QRect(130, 160, 75, 23))
        self.btnCancel.setObjectName("btnCancel")
        self.lineEdit_2 = QtWidgets.QLineEdit(winFilter)
        self.lineEdit_2.setGeometry(QtCore.QRect(60, 100, 113, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")

        self.retranslateUi(winFilter)
        QtCore.QMetaObject.connectSlotsByName(winFilter)

    def retranslateUi(self, winFilter):
        _translate = QtCore.QCoreApplication.translate
        winFilter.setWindowTitle(_translate("winFilter", "Form"))
        self.btnAccept.setText(_translate("winFilter", "Применить"))
        self.btnCancel.setText(_translate("winFilter", "Отмена"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    winFilter = QtWidgets.QWidget()
    ui = Ui_winFilter()
    ui.setupUi(winFilter)
    winFilter.show()
    sys.exit(app.exec_())

win2.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_winFilter2(object):
    def setupUi(self, winFilter2):
        winFilter2.setObjectName("winFilter2")
        winFilter2.resize(241, 229)
        winFilter2.setStyleSheet("background-color: gray;")
        self.lineEdit = QtWidgets.QLineEdit(winFilter2)
        self.lineEdit.setGeometry(QtCore.QRect(60, 50, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.btnAccept = QtWidgets.QPushButton(winFilter2)
        self.btnAccept.setGeometry(QtCore.QRect(40, 160, 75, 23))
        self.btnAccept.setObjectName("btnAccept")
        self.btnCancel = QtWidgets.QPushButton(winFilter2)
        self.btnCancel.setGeometry(QtCore.QRect(130, 160, 75, 23))
        self.btnCancel.setObjectName("btnCancel")
        self.lineEdit_2 = QtWidgets.QLineEdit(winFilter2)
        self.lineEdit_2.setGeometry(QtCore.QRect(60, 100, 113, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")

        self.retranslateUi(winFilter2)
        QtCore.QMetaObject.connectSlotsByName(winFilter2)

    def retranslateUi(self, winFilter2):
        _translate = QtCore.QCoreApplication.translate
        winFilter2.setWindowTitle(_translate("winFilter2", "Form"))
        self.btnAccept.setText(_translate("winFilter2", "Применить"))
        self.btnCancel.setText(_translate("winFilter2", "Отмена"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    winFilter2 = QtWidgets.QWidget()
    ui = Ui_winFilter2()
    ui.setupUi(winFilter2)
    winFilter2.show()
    sys.exit(app.exec_())

Ответы

▲ 1Принят

Как вариант:

main.py

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *

from q1509793_main_ui import Ui_MainWindow                # +++
from q1509793_fil import Filter1, Filter2                 # +++


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        
        self.fil1 = Filter1(self)                                  # +++ self
        self.fil2 = Filter2(self)                                  # +++ self
        
#        self.btnOpenFilter.clicked.connect(lambda: self.fil1.show())
#        self.btnOpenFilter_2.clicked.connect(lambda: self.fil2.show())
        self.btnOpenFilter.clicked.connect(self.fil1.show)
        self.btnOpenFilter_2.clicked.connect(self.fil2.show)
        
# ?      self.data = ""    # В этот параметр нужно записать данные, введённые в окнах
        self.data = {}     # +++ 
        
    def call_data(self):  # В этом методе отобразить поля, которые были заполнены
        print(self.data)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

q1509793_fil.py

from PyQt5 import QtCore, QtGui, QtWidgets

#from win1 import Ui_winFilter
class Ui_winFilter(object):
    def setupUi(self, winFilter):
        winFilter.setObjectName("winFilter")
        winFilter.resize(241, 229)
        self.lineEdit = QtWidgets.QLineEdit(winFilter)
        self.lineEdit.setGeometry(QtCore.QRect(60, 50, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.btnAccept = QtWidgets.QPushButton(winFilter)
        self.btnAccept.setGeometry(QtCore.QRect(40, 160, 75, 23))
        self.btnAccept.setObjectName("btnAccept")
        self.btnCancel = QtWidgets.QPushButton(winFilter)
        self.btnCancel.setGeometry(QtCore.QRect(130, 160, 75, 23))
        self.btnCancel.setObjectName("btnCancel")
        self.lineEdit_2 = QtWidgets.QLineEdit(winFilter)
        self.lineEdit_2.setGeometry(QtCore.QRect(60, 100, 113, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")

        self.retranslateUi(winFilter)
        QtCore.QMetaObject.connectSlotsByName(winFilter)

    def retranslateUi(self, winFilter):
        _translate = QtCore.QCoreApplication.translate
        winFilter.setWindowTitle(_translate("winFilter", "Form"))
        self.btnAccept.setText(_translate("winFilter", "Применить"))
        self.btnCancel.setText(_translate("winFilter", "Отмена"))
        
#from win2 import Ui_winFilter2
class Ui_winFilter2(object):
    def setupUi(self, winFilter2):
        winFilter2.setObjectName("winFilter2")
        winFilter2.resize(241, 229)
        winFilter2.setStyleSheet("background-color: gray;")
        self.lineEdit = QtWidgets.QLineEdit(winFilter2)
        self.lineEdit.setGeometry(QtCore.QRect(60, 50, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.btnAccept = QtWidgets.QPushButton(winFilter2)
        self.btnAccept.setGeometry(QtCore.QRect(40, 160, 75, 23))
        self.btnAccept.setObjectName("btnAccept")
        self.btnCancel = QtWidgets.QPushButton(winFilter2)
        self.btnCancel.setGeometry(QtCore.QRect(130, 160, 75, 23))
        self.btnCancel.setObjectName("btnCancel")
        self.lineEdit_2 = QtWidgets.QLineEdit(winFilter2)
        self.lineEdit_2.setGeometry(QtCore.QRect(60, 100, 113, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")

        self.retranslateUi(winFilter2)
        QtCore.QMetaObject.connectSlotsByName(winFilter2)

    def retranslateUi(self, winFilter2):
        _translate = QtCore.QCoreApplication.translate
        winFilter2.setWindowTitle(_translate("winFilter2", "Form"))
        self.btnAccept.setText(_translate("winFilter2", "Применить"))
        self.btnCancel.setText(_translate("winFilter2", "Отмена"))


class Filter1(QtWidgets.QWidget, Ui_winFilter):            # +++
    def __init__(self, parent):                            # +++ parent
        super().__init__()
        self.setupUi(self)
        
        self.parent = parent                               # +++
 
        self.btnAccept.clicked.connect(lambda: self.get_fields('Filter1')) # +++
        self.btnCancel.clicked.connect(self.close)

    def get_fields(self, filter):                                          # +++
    #   return (self.lineEdit.text()......)
# !!! +++
        self.parent.data[filter] = (self.lineEdit.text(), self.lineEdit_2.text())
        self.parent.call_data()
        self.close()
# !!! +++    


class Filter2(QtWidgets.QWidget, Ui_winFilter2):
    def __init__(self, parent):
        super().__init__()
        self.setupUi(self)
        
        self.parent = parent
        
        self.btnAccept.clicked.connect(lambda: self.get_fields('Filter2'))
        self.btnCancel.clicked.connect(self.close)
        
    def get_fields(self, filter):
    #   return (self.lineEdit.text()......)

        self.parent.data[filter] = (self.lineEdit.text(), self.lineEdit_2.text())
        self.parent.call_data()
        self.close()

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