#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.