Я пытаюсь написать код, где я подключаю устройство через последовательный порт. Связь с последовательным портом осуществляется потоком. Если порт не занят - все в порядке и работает по плану, но если порт занят или по какой-то причине не удалось подключиться - я хочу, чтобы мой GUI распечатал ошибку. Он выводит ошибку, но затем застревает и вылетает. Как я могу это исправить? Кроме того, в моем GUI есть меню, и я хочу, чтобы оно сортировалось по номеру 'COM', как я могу это сделать?
Ниже приведен мой код:
GUI part:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(500, 150)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.connectBtn = QtWidgets.QPushButton(self.centralwidget)
self.connectBtn.setGeometry(QtCore.QRect(85, 50, 75, 23))
self.connectBtn.setObjectName("connectBtn")
self.portList = QtWidgets.QPushButton(self.centralwidget)
self.portList.setGeometry(QtCore.QRect(10, 50, 65, 23))
self.portList.setObjectName("portList")
self.productMenu=QtWidgets.QMenu(self.centralwidget)
self.portList.setMenu(self.productMenu)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "GUI"))
self.portList.setText(_translate("MainWindow", "Ports"))
self.connectBtn.setText(_translate("MainWindow", "Connect"))
Управляемая часть с моими функциями и потоком:
from PyQt5 import QtWidgets, QtCore, QtGui
from test1 import Ui_MainWindow
import serial.tools.list_ports
from test2 import DEVICE
import sys,traceback
import time
try:
import queue
except ImportError:
import Queue as queue
class deviceWorker(QtCore.QRunnable):
def __init__(self,port,q):
super(deviceWorker, self).__init__()
self.finished = QtCore.pyqtSignal()
self.port=port
self.Q=q
def run(self):
try:
self.ecc=DEVICE(self.port)
except:
print("ERROR")
else:
self.Q.put(self.ecc.version())
class ApplicationWindow(QtWidgets.QMainWindow):
def __init__(self):
super(ApplicationWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.threadpool=QtCore.QThreadPool()
self.Q=queue.Queue()
self.ui.productMenu.aboutToShow.connect(self.findPort)
self.ui.connectBtn.clicked.connect(self.cntClk)
def findPort(self):
self.ui.productMenu.clear()
comPorts = list(serial.tools.list_ports.comports())
for port in comPorts:
self.ui.productMenu.addAction(str(port),self.selectedPort)
def selectedPort(self):
self.portNum=self.sender()
self.portNum=self.portNum.text()
self.ui.portList.setText(self.portNum[:4])
self.portNum=self.portNum[3]
####How to sort this menu?###
def cntClk(self):
self.worker=deviceWorker(self.portNum,self.Q)
self.threadpool.start(self.worker)
ver=self.worker.Q.get()
if(ver[:3]=="VER"):
print(ver)
else:
print("Error!")
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
application = ApplicationWindow()
application.show()
sys.exit(app.exec_())
И, наконец, часть с классом 'DEVICE', которая отвечает за отправку устройство команды: import serial
class DEVICE():
def __init__(self,Port ):
self.ser = serial.Serial(port ='COM'+str(Port), baudrate= 38400,timeout=1)
def cmd(self,command):
return ('00'+command+chr(13)).encode('utf-8')
def version(self):
self.ser.write(self.cmd('VER'))
ver=self.ser.readline()
ver=(ver.decode('utf-8'))
ver=ver[:9]
return(ver)
Я хотел бы знать, если кто-нибудь знает, как решить эту проблему, и, как уже было сказано, также разобраться в моем списке портов.