2016-09-23 202 views
0

這裏是我的QT碼函數指針

from PyQt4 import QtGui, QtCore 
from PyQt4.QtCore import QTime 
from PyQt4.QtGui import QApplication 
from keithley.PS2231A import PS2231A 

class A(QtGui.QMainWindow, gui.Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(A, self).__init__(parent) 
     self.setupUi(self) 
     ps = PS2231A(port='COM8') 
     self.refresh.clicked.connect(self.get_data) 

    def get_data(self): 
     data = ps.read_current() 
     self.current_measurement.setText(str(data)) 

def main(): 
    app = QtGui.QApplication([]) 
    form = A() 
    form.show() 
    app.exec() 

if __name__ == '__main__': 
    main() 

現在,這裏是我的PS2231A庫

class PS2231A: 
    def __init__(self, port: str): 
     self._port = port 
     self._dev = serial.Serial() 
     self._dev.port = self._port 
     self._dev.timeout = 5 
     self._dev.baudrate = 9600 
     self.connect() 
     self._dev.open() 

    def read_current(self): 
     self._dev.write('MEAS:CURR?') 
     current = self._dev.readline() 
     return float(current) 

這裏是我想什麼來實現: 電源提供緊急消息像過流。它基本上是在沒有任何命令請求數據的情況下將該消息寫入串行端口。一旦收到該消息,我想要改變GUI。

範圍: 在這裏,我正在爲PS2231A編寫庫,用戶將圍繞它編寫一個GUI。我希望庫方解決方案將消息傳播到GUI,這裏是我的設想:

步驟1:創建PS2231A的對象時,啓動一個線程,它將讀取串口(輪詢它)消息。一旦緊急消息被讀取,它就調用庫中的一個函數。 步驟2:線程調用的函數應該執行用戶想要的任何函數,即如果用戶想要將GUI背景變爲紅色,用戶將代碼寫入名爲turn_background_red的函數,並將函數名稱傳遞給庫函數。然後,只要緊急消息被調用,庫函數就會執行代碼。

我認爲下面的代碼會解釋這口井(我希望這樣的事情發生,所以一些代碼將無法正常工作):

QT碼

from PyQt4 import QtGui, QtCore 
from PyQt4.QtCore import QTime 
from PyQt4.QtGui import QApplication 
from keithley.PS2231A import PS2231A 

class A(QtGui.QMainWindow, gui.Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(A, self).__init__(parent) 
     self.setupUi(self) 
     ps = PS2231A(port='COM8') 
     ps.set_over_current_callback(self.warn_user) 
     self.refresh.clicked.connect(self.get_data) 

    def warn_user(self): 
     # manipulate some GUI element 
     # implemented by user 

    def get_data(self): 
     data = ps.read_current() 
     self.current_measurement.setText(str(data)) 

def main(): 
    app = QtGui.QApplication([]) 
    form = A() 
    form.show() 
    app.exec() 

if __name__ == '__main__': 
    main() 

類代碼實現

class PS2231A: 
    def __init__(self, port: str): 
     self._port = port 
     self._dev = serial.Serial() 
     self._dev.port = self._port 
     self._dev.timeout = 5 
     self._dev.baudrate = 9600 
     self.connect() 
     self._dev.open() 

    def read_current(self): 
     self._dev.write('MEAS:CURR?') 
     current = self._dev.readline() 
     return float(current) 

    def set_over_current_callback(self, function_name): 
     # write some code to run the function name passed to this function 
     # This is the code I am not sure how to go ahead with 

     # This function will be executed if an emergency message is received 
     # on serial port 

我在考慮這個問題時遇到的一些關鍵挑戰是要執行的功能處於不同的階級。

+1

如果您意識到您的問題在初稿中不明確,您實際上不必*發佈問題。只要繼續編輯,直到您認爲它已經清晰並準備好閱讀。 –

+0

顯示代碼請輸入有效的電話號碼。這是模糊的,你基本上要求我們爲你寫這個項目。 –

+1

但是,在這一點上,您的帖子中實際上並沒有* concreate,actionable question *。 Stack Overflow並不適合模糊的架構頭腦風暴問題,對不起。 –

回答

0

你真的應該修改你的問題更多的(見Minimal, Complete and Verifiable),但這裏是一個解決方案,應該至少兩個的Python 2.7和3.5的工作:

import types 

class PS2231A: 

    # Rest of your class 

    def set_over_current_callback(self, function_name): 
     func = getattr(self, function_name, None) 
     if isinstance(func, types.MethodType): 
      func() 
     return 

此檢查PS2231A類的實例有一個名稱爲function_name的屬性,如果它的類型是方法,它將被調用。

讓我知道如果我犯了一些錯誤,在手機上輸入這個。

+0

我認爲這將工作,如果function_name是從類PS2231A,但我不知道如果此解決方案將工作,如果function_name傳遞給set_over_current_callback是從另一個類。你怎麼看? –

+0

另外,因爲我對堆棧溢出很新,你能幫我修改這個問題嗎,所以這可以成爲其他人的有用資源。我會在你的回答中看到鏈接,並會更新問題,並希望你反饋。 –

+0

好吧,如果你能澄清那些需要被調用的函數到底在哪裏,這將有所幫助? _i.e。如果用戶想要將GUI背景變爲紅色,則用戶將該代碼寫入名爲turn_background_red_的函數中。這是否意味着用戶_writes_函數?他們在哪裏寫它?如果有很多函數需要通過套接字使用不同的參數來調用,我認爲用編碼和解碼的消息編寫一個真正的協議會更好。或者,如果您的意思是用戶在_client_上寫函數,那麼這是一個不同的話題。 –