Как получить информацию из второго окна в первом входе в QTextEdit () - PullRequest
1 голос
/ 11 июня 2019
  • Приложение PyQt5 с несколькими окнами
  • Кнопка «Добавить» во втором окне
  • После нажатия кнопки необходимо отобразить в QTextEdit () в главном окне:«Добавлено»

  • Попробуйте импортировать из второго окна первое и: QTextEdit (). Append («добавлено»).Но первое окно уже импортировано во второе, тогда я получаю сообщение об ошибке (Второе окно импортирует себя ...)

Это главное окно:

from PyQt5.QtWidgets import *
import sys
from App.A_Client import NewClient

class Crm(QWidget):

    def __init__(self, parent=None):
        super(Crm, self).__init__()

        self.setGeometry(50, 50, 400, 100)
        self.setWindowTitle("CRM TEST")

        self.grid = QGridLayout()
        self.grid.setSpacing(10)
        self.setLayout(self.grid)

        self.home()

    def home(self):

        self.message_box = QTextEdit()
        self.message_box.setReadOnly(True)
        self.grid.addWidget(self.message_box, 3, 0, 5, 3)

# NEED TO APPEND THE "ADDED" IN SELF.MESSAGE_BOX FROM CLICK IN THE SECOND WINDOW

        self.dialogs = list()

        self.show()

    def btn1_on(self):

        dialog = NewClient(self)
        self.dialogs.append(dialog)
        dialog.show()

if __name__ == "__main__":

    app = QApplication([])
    launch = Crm()
    app.exec_()

есть второй:

from PyQt5.QtWidgets import *
from App.App_main import Crm


class NewClient(QWidget):

    def __init__(self, parent = None):
        super(NewClient, self).__init__()

        self.setWindowTitle("ADD CLIENT")

        self.grid = QGridLayout()
        self.setLayout(self.grid)

        self.home()

    def home(self):

        self.btn_client_add = QPushButton("Add", self)
        self.grid.addWidget(self.btn_client_add, 12, 0, 12, 3)
        self.btn_client_add.clicked.connect(self.btn_add_on)

    def btn_add_on(self):

        if self.check_client_option_news_letter.isChecked():
            news_letter = "True"
        else:
            news_letter = "False"

        if self.check_client_option_other.isChecked():
            option = "True"
        else:
            option = "False"

        choice = QMessageBox.question(self, "Execute", "Do you want to add this client ?", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)

        if choice == QMessageBox.Yes:

            Crm.message_box.append("Added") # THERE IS WHEN I WOULD LIKE TO APPEND THE "ADDED"


        else:
            pass

1 Ответ

1 голос
/ 11 июня 2019

У вас есть круговой импорт , так как файл A импортирует B, а B импортирует A. Один из способов избежать этого - использовать сигналы рядом с Single responsibility principle: у каждого класса должен быть набор задач, в этом случае через сигнал посылается текст в другое окно.

App_main.py

# ...
def btn1_on(self):
    dialog = NewClient(self)
    dialog.sendTextSignal.connect(self.message_box.append) # connect signal to slot
    self.dialogs.append(dialog)
    dialog.show()
# ...

A_Client.py

from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal
# It is not necessary to import Crm
# from App.App_main import Crm


class NewClient(QWidget):
    sendTextSignal = pyqtSignal(str) # create signal

    # ...

   def btn_add_on(self):
        # ...
        choice = QMessageBox.question(
            self,
            "Execute",
            "Do you want to add this client ?",
            QMessageBox.Yes | QMessageBox.No,
            QMessageBox.Yes,
        )
        if choice == QMessageBox.Yes:
            self.sendTextSignal.emit("Added") # emit signal
        else:
            pass
# ...

Как вы видите в классе NewClient не знает Crm, он только излучает сигнал, а затем в Crm сигнал подключается к слоту добавленияQTextEdit, в этом случае необходимо, чтобы Crm знал NewClient.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...