2014-09-03 35 views
0

我是新來的python和我的項目我已經完成了一個實現從微控制器獲取數據(通過UART採樣數據到我的電腦)的函數。Python:如何檢測函數完成並重新啓用按鈕?

這需要幾秒鐘,這取決於我希望收集多少個樣本。這與直接的Python腳本工作正常。

但是,我希望實現一個GUI,我選擇PyQt來做到這一點。我想要做的就是在按下按鈕時調用該函數。

我將試圖解釋我想在下面的順序步驟來實現的:

  1. 點擊按鈕。
  2. 按鈕被禁用。
  3. 調用函數collectDataFromUART()。
  4. 等待/檢測數據收集完成(幾秒)
  5. 重新啓用按鈕。

我有一個按鈕clicked處理程序,如下圖所示:

self.ui.pushButton1.clicked.connect(self.handlepushButton1) 

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

我無法理解的是如何檢測功能collectDataFromUART(完成),然後才重新啓用按鈕。

任何人都可以對此有所瞭解嗎?例子會非常有幫助。

幫助!謝謝。

+0

添加這個作爲評論而不是回答,因爲我不熟悉這些庫或這種使用python。但是你可以添加一個變量?在函數的開始處有'running = true',最後是'running = false'。然後依靠這個變量使得按下按鈕的能力。 (這顯然不是正確的代碼,但更像是僞代碼來幫助解釋)'while running == true:clickable == false else:clickable == true' – 2014-09-03 09:28:47

+1

爲什麼不在'handlepushButton1'中放置另一行來重新啓用按鈕?此行將在'collectDataFromUART'返回時運行。 – jonrsharpe 2014-09-03 09:31:02

+0

最Qt的做法是通過一個信號(將數據集合包裝在派生自QObject的類中,定義信號,在數據採集結束時發出信號,將gui連接到信號並做任何你想做的事情)。 – Trilarion 2014-09-04 09:01:51

回答

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])之後,只需撥打一些數據self.mysignal[type of data].emit(<data>)

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_()) 
相關問題