我是python的新手,在我的项目中,我已经完成了一个实现从微控制器获取数据的实现的功能(通过UART将数据采样到我的PC)。
这需要几秒钟,这取决于我希望收集多少样品。这适用于简单的python脚本。
但是,我希望实现一个GUI,我选择了PyQt来实现它。我想要做的就是按下按钮时调用该功能。
我将尝试按以下顺序步骤解释我想要实现的目标:
我有一个按钮clicked
处理程序,如下所示:
self.ui.pushButton1.clicked.connect(self.handlepushButton1)
def handlepushButton1(self):
self.ui.textEdit1.append("Started")
collectDataFromUART()
我无法理解的是如何检测函数collectDataFromUART()的完成情况,然后才重新启用该按钮。
任何人都可以对此有所了解吗?示例将非常有用。
帮助!谢谢。
答案 0 :(得分:2)
我建议在完成后将collectDataFromUART()
放入另一个帖子和emit
消息中。像这样:
mysignal = QtCore.pyqtSignal()
class NamedThread(QtCore.QThread):
def __init__(self, parent=None):
super(self.__class__, self).__init__(parent)
def run(self):
<some code from collectDataUART>
self.mysignal.emit()
class NamedWidget(QtGui.QWidget):
def __init__(self, parent=None):
<some code>
self.thread = NamedThread()
self.pushButton1.clicked.connect(self.handlepushButton1)
self.thread.mysignal.connect(lambda: self.pushButton1.setEnabled(True), QtCore.Qt.QueuedConnection)
def handlepushButton1(self):
self.pushButton1.setDisabled(True)
self.thread.start()
您还可以在信号中添加一些有关执行状态的信息。为此,您需要pyqtSiglnal([type of data you want to send])
之后只需使用某些数据调用emit self.mysignal[type of data].emit(<data>)
答案 1 :(得分:1)
对于我的观点,听起来你应该通过创建QThread
来接收你的UART数据。首先,您已启动线程以接收UART数据和关闭按钮。接下来,等待这个帖子。如果成功或失败,则创建信号发送回主窗口小部件。最后,处理它想要的信号数据;
小例子;
import sys
import time
from PyQt4 import QtGui
from PyQt4 import QtCore
def collectDataFromUART ():
# Your collect data from UART
time.sleep(1)
data = 'UART'
return data
class QCustomThread (QtCore.QThread):
status = QtCore.pyqtSignal(object, object)
def __init__ (self, parentQWidget = None):
super(QCustomThread, self).__init__(parentQWidget)
def run (self):
try:
data = collectDataFromUART()
errorCode = None
except Exception, error:
data = None
errorCode = str(error)
self.status.emit(data, errorCode)
self.exit(0)
class QCustomMainWindow (QtGui.QMainWindow):
def __init__ (self):
super(QCustomMainWindow, self).__init__()
self.startQPushButton = QtGui.QPushButton('START')
self.startQPushButton.released.connect(self.requestWork)
self.setCentralWidget(self.startQPushButton)
def requestWork (self):
self.startQPushButton.setEnabled(False)
myQCustomThread = QCustomThread(self)
myQCustomThread.status.connect(self.relpyWork)
myQCustomThread.start()
def relpyWork (self, data, errorCode):
self.startQPushButton.setEnabled(True)
if errorCode == None:
QtGui.QMessageBox.information(self, 'Information', data)
else:
QtGui.QMessageBox.critical(self, 'Critical', errorCode)
myQApplication = QtGui.QApplication(sys.argv)
myQCustomMainWindow = QCustomMainWindow()
myQCustomMainWindow.show()
sys.exit(myQApplication.exec_())