QCoreApplication ::exec: цикл событий уже запущен — вызов другого файла PyQt5

#python #pyqt5

#python #pyqt5

Вопрос:

Я запускаю приложение PyQt5, в котором есть кнопка, которая должна вызывать другой файл PyQt5 в отдельном окне. Я установил кнопку для вызова функции ‘main2’ в другом PyQt5, который .показать другой файл. Независимо они отлично работают, но когда я пытаюсь подключить их таким образом, я получаю сообщение об ошибке выше.

 from ShowRecords import main2

class ExerciseTracker(QDialog):
    def __init__(self):
        super().__init__()
        self.myWindow = QDialog()
        #self.title = 'Exercise Tracker'
        self.myWindow.setWindowTitle('Exercise Tracker')
        self.setGeometry(200, 400, 300, 200)
        self.move(60, 15)
        self.layout = QFormLayout()
        self.layout.addRow(QLabel('<h2>Welcome to the App!</h2>', parent=self.myWindow))
        line_edit1 = QLineEdit()
        self.layout.addRow('Day of the week: ', line_edit1)
        line_edit2 = QLineEdit()
        self.layout.addRow('Body Part: ', line_edit2)
        line_edit3 = QLineEdit()
        self.layout.addRow('Input Exercise: ', line_edit3)
        line_edit4 = QLineEdit()
        self.layout.addRow('Input Sets: ', line_edit4)
        line_edit5 = QLineEdit()
        self.layout.addRow('Input Reps: ', line_edit5)
        btn1 = QPushButton('Submit')
        self.layout.addRow(btn1)
        btn2 = QPushButton('Show Records')
        self.layout.addRow(btn2)
        #btn1.clicked.connect('submit')
        btn2.clicked.connect(main2)
        # layout.addWidget()
        self.myWindow.setLayout(self.layout)
        self.myWindow.show()

def main():
    exercise = QApplication(sys.argv)
    view = ExerciseTracker()
    #view.show()
    sys.exit(exercise.exec_())

if __name__ =='__main__':
    main()

  

Другой файл называется ShowRecord то, что я вызываю, это ‘

 def main2():
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())
  

Ответ №1:

Вы можете проверить, запущен ли цикл событий, используя что-то вроде этого:

 app = QtCore.QCoreApplication.instance()
if app is None:
    app = QtWidgets.QApplication(sys.argv)
  

Однако почти наверняка есть лучший способ создать свой графический интерфейс. Один из вероятных способов — создать подкласс QWidget, который инкапсулирует поведение вашей Ui_Form и импортировать этот класс вместо другого метода main() . Затем вы можете использовать виджет ExerciseTracker для создания дочерних виджетов «Ui_Form», Что гарантирует все правильное управление памятью Qt и т. Д.