2016-09-23 119 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_上写函数,那么这是一个不同的话题。 –