使用ctypes创建Objective-C结构?

时间:2013-09-14 18:06:39

标签: python macos ctypes

我正在尝试使用Python ctypes从Apple的CoreGraphics库创建CGRect Struct。

CoreGraphics/CGBase.h CGRect内部定义如下:

/* Points. */

struct CGPoint {
  CGFloat x;
  CGFloat y;
};
typedef struct CGPoint CGPoint;

/* Sizes. */

struct CGSize {
  CGFloat width;
  CGFloat height;
};
typedef struct CGSize CGSize;

/* Rectangles. */

struct CGRect {
  CGPoint origin;
  CGSize size;
};
typedef struct CGRect CGRect;  

在python中,我尝试使用以下代码重新创建Struct:

import ctypes
from ctypes.util import find_library

cg = ctypes.cdll.LoadLibrary(find_library('CoreGraphics'))

class CGPoint(ctypes.Structure):
    _fields_ = [
        ('x', ctypes.c_float),
        ('y', ctypes.c_float)
    ]

class CGSize(ctypes.Structure):
    _fields_ = [
        ('width', ctypes.c_float),
        ('height', ctypes.c_float)
    ]

class CGRect(ctypes.Structure):
    _fields_ = [
        ('origin', CGPoint),
        ('size', CGSize)
    ]

这似乎有效。我可以检查它并为它分配值没有问题。

myCoolRect = CGRect()
myCoolRect.origin.x = 0.0
myCoolRect.origin.y = 0.0
myCoolRect.size.width = 1000.0
myCoolRect.size.height = 1000.0 

但是,如果我尝试将此结构传递给ApplicationServices的函数,例如CG.CGWindowListCreateImage(),我会收到以下错误:

TypeError: depythonifying struct, got no sequence   

我是否错误地设置了结构..?

2 个答案:

答案 0 :(得分:1)

如果您打开CGBase.h,您会发现:

#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
# define CGFLOAT_IS_DOUBLE 1
# define CGFLOAT_MIN DBL_MIN
# define CGFLOAT_MAX DBL_MAX
#else
# define CGFLOAT_TYPE float
# define CGFLOAT_IS_DOUBLE 0
# define CGFLOAT_MIN FLT_MIN
# define CGFLOAT_MAX FLT_MAX
#endif

typedef CGFLOAT_TYPE CGFloat;

因此,如果运行32位或64位,CGFLOAT可以是float或double。你正在使用浮动。也许您使用的是{64},而是使用float代替double

答案 1 :(得分:0)

你可以在pyObjc中使用元组,只需(123,456)而不是struct.pack('QQ',123,456)