如何从cffi回调中发出PyQt信号

时间:2019-06-26 08:26:16

标签: python events callback pyqt python-cffi

我现在有点卡住了。因为我什至不知道要在google中确切输入什么内容,所以这更像是“如何正确处理此问题”的问题。

我从thorlabs获得了一台科学相机,它仅提供一个C DLL作为API。我编写了一个python类,使用CFFI封装了API,效果非常好。该API支持注册一个回调方法,当有新的相机框架可用时将调用该方法。使用CFFI可以将python方法注册为回调,由DLL调用。

我现在的最终目标是在PyQt应用程序中显示框架。所以我想我可以使用帧回调来发出信号,该信号连接到pyqt-socket绘制下一帧。

现在的问题是,回调必须提供API调用的适当接口,这当然很合理。但是要发出PyQt信号,我需要在派生自QObject的对象上调用generate()。

如何获取通用回调方法来保留此类对象?

由于我想将摄像头处理类与GUI部分分开,所以我真的不想在摄像头类中创建全局QObject或类似的东西,只是想让我有一个要调用的元素(我真的不想在相机类中有针对该应用程序的任何特定于应用程序的对象,因为我想使其尽可能通用,如果可以的话

为了测试,我编写了一个小的回调方法,该方法仅在被调用时打印出一条小消息,并使用提供的set_callback方法。 我还尝试使用matplotlib显示框架,但是由于matplotlib不喜欢被其他线程调用,因此效果并不理想。 我只是不知道如何适当地处理我在回调方法中收到的数据。

这些是必需的回调类型和用于设置回调的函数

typedef void(*TL_CAMERA_FRAME_AVAILABLE_CALLBACK)(void* sender, unsigned short* image_buffer, int frame_count, unsigned char* metadata, int metadata_size_in_bytes, void* context);

typedef int(*TL_CAMERA_SET_FRAME_AVAILABLE_CALLBACK)(void* tl_camera_handle, TL_CAMERA_FRAME_AVAILABLE_CALLBACK handler, void* context);

然后在Python中,我可以创建一个回调方法并为其分配

from _Thorlabscam import lib, ffi

@ffi.def_extern()
def python_frame_callback(sender, buffer, framecount, metadata, metasize, context):
    print("Frame acquired!")
    # How can I process all the nice data I have at this point?

lib.tl_camera_set_frame_available_callback(camHandle, frame_callback, ffi.NULL)

对于这个措辞不好的问题,我真的感到很抱歉,但是我不知道如何将这两个概念结合在一起。我可以通过一些循环来轮询摄像机,但是我想使其成为事件驱动的,因为我发现它“更干净”(我只是想让它为我的个人满意而工作:)) 谢谢大家

0 个答案:

没有答案