Python:如何检测功能完成并重新启用按钮?

时间:2014-09-03 09:24:50

标签: python python-2.7 pyqt

我是python的新手,在我的项目中,我已经完成了一个实现从微控制器获取数据的实现的功能(通过UART将数据采样到我的PC)。

这需要几秒钟,这取决于我希望收集多少样品。这适用于简单的python脚本。

但是,我希望实现一个GUI,我选择了PyQt来实现它。我想要做的就是按下按钮时调用该功能。

我将尝试按以下顺序步骤解释我想要实现的目标:

  1. 点击按钮。
  2. 按钮已停用。
  3. 调用函数collectDataFromUART()。
  4. 等待/检测数据收集完成(几秒钟)
  5. 重新启用按钮。
  6. 我有一个按钮clicked处理程序,如下所示:

        self.ui.pushButton1.clicked.connect(self.handlepushButton1)
    
        def handlepushButton1(self):
           self.ui.textEdit1.append("Started")
           collectDataFromUART()
    

    我无法理解的是如何检测函数collectDataFromUART()的完成情况,然后才重新启用该按钮。

    任何人都可以对此有所了解吗?示例将非常有用。

    帮助!谢谢。

2 个答案:

答案 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_())