Почему мое приложение вылетает без ошибок при использовании PyQt5

#python #pyqt5

#python #pyqt5

Вопрос:

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

Это часть моего кода, в чем моя проблема, я объясню после

 def displayModbus(self):

    modbusReturn = modbus.readModbus()
    commStatus = modbusReturn[0]


    if commStatus:
        listRegValue = modbusReturn[1]

        #Display data to ui

        if str(listRegValue[1]) == "1":  #HEATING_ST
            self.ui.lnHeatingStatus.setText("On")
        else:
            self.ui.lnHeatingStatus.setText("Off")

        # self.ui..setText(str(listRegValue[2])) #WAIT_TIME_CHG
        # self.ui..setText(str(listRegValue[3])) #RUN_TIME_CHG

        if str(listRegValue[4]) == "1": #ON_WAIT_TIME_P
            self.ui.ledWaitTime.setStyleSheet("QPushButton {background-color:green;}")
        else:
            self.ui.ledWaitTime.setStyleSheet("QPushButton {background-color:red;}")
        
        if str(listRegValue[5]) == "1":  #RUN_CYCLE
            self.ui.lnRunCycle.setText("On")
        else:
            self.ui.lnRunCycle.setText("Off")

        # self.ui..setText(str(listRegValue[6])) #LEVEL_RESET
        # self.ui..setText(str(listRegValue[7])) #CYL_MAN_CYCLE
        # self.ui..setText(str(listRegValue[8])) #CYL_EMPTY
        # self.ui..setText(str(listRegValue[9])) #CYL_EMPTY_END
        # self.ui..setText(str(listRegValue[10])) #NORASYSTEM_MANUAL
        # self.ui..setText(str(listRegValue[11])) #NORASYSTEM_ON
        # self.ui..setText(str(listRegValue[12])) #HEATING_ALLOW

        if str(listRegValue[13]) == "1":  #LOW_AIRFLOW
            self.ui.lnLowAirflow.setText("Low")
        else:
            self.ui.lnLowAirflow.setText("Normal")

        # self.ui..setText(str(listRegValue[15])) #HUM_ALLOW

        TC1 = listRegValue[16] / 100
        self.ui.lnTC1.setText(str(TC1) " °C") #TC1

        TC2 = listRegValue[17] / 100
        self.ui.lnTC2.setText(str(TC2) " °C") #TC2

        TC3 = listRegValue[18] / 100
        self.ui.lnTC3.setText(str(TC3) " °C") #TC3

        TC4 = listRegValue[19] / 100
        self.ui.lnTC4.setText(str(TC4) " °C") #TC4

        self.ui.lnH1.setText(str(listRegValue[20]) " %RH") #HUM1


        waitTime = str(listRegValue[22] / 3600)
        self.ui.lnWaitTime.setText(str(waitTime " hr")) #WAIT_TIME_D

        runTime = str(listRegValue[23] / 60)
        self.ui.lnRunTime.setText(str(runTime " min")) #RUN_TIME_D

        timeRemainM = str(int(listRegValue[24] / 60)) 
        timeRemainS = str(int(listRegValue[24] % 60))
        self.ui.lnTimeRemain.setText(str(timeRemainM   " min " timeRemainS   " sec")) #TIME_REMAIN_D

        self.ui.lnLevel.setText(str(listRegValue[25])) #LEVEL_D

        self.statusBar().showMessage("Modbus communication OK")

    else:
        self.statusBar().showMessage("Error modbus communication")
  

Проблема возникает из-за этой функции после многих попыток и ошибок. Если я удаляю его, программа не вылетает, НО если я изменяю ее с помощью функции печати (пример: print(str(listRegValue[4]))) все хорошо, поэтому моя проблема не связана с модулем odbus назначения mGUI.
моя функция displayModbus обновляется каждые 5 секунд (с использованием QtThreading).
Если я сохраняю только одну переменную для отображения, мое приложение не вылетает.

У меня есть другое приложение для чтения и записи данных modbus с использованием той же функции displayModbus (без отображения QT5), и у меня нет проблем

У меня эта проблема на 2 компьютерах, и я пробую ее на 5 компьютерах (4x Windows 10 и 1x Linux)

  • Python 3.8.6
  • PyQt== 5.15.1
  • PyQt5-sip ==12.8.1

Есть идеи?

Спасибо.

Комментарии:

1. запустите мой скрипт с консоли, чтобы получить сообщение об ошибке

2. Какой скрипт? Мой код через консоль не отображает никаких ошибок

3. Случайно ли displayModbus оно вызывается непосредственно в потоке? Если это так, в этом проблема: к элементам GUI можно получить доступ только непосредственно из основного потока Qt, а не из внешних потоков. Для этого вам нужно использовать сигналы и слоты (в вашем случае, заставить поток выдавать пользовательский сигнал и подключить этот сигнал к displayModbus . Тот факт, что «иногда» это работает, объясняется только некоторыми специфическими условиями, которые позволяют очереди работать должным образом даже при доступе к объектам пользовательского интерфейса из другого потока, но эти условия непредсказуемы и ненадежны.

4. Большое вам спасибо! Я меняю свою стратегию потоков. Я включил свою функцию displayModbus в свой запуск и отправил результат в свою функцию GUI.