我正在尝试使用 Python ctypes 从 Apple 的 CoreGraphics 库创建 CGRect
结构。
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 中,我尝试使用以下代码重新创建结构:
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
我是否错误地设置了结构?
最佳答案
如果你打开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;
因此,CGFLOAT
可以是浮点型也可以是 double 型,具体取决于您运行的是 32 位还是 64 位。您正在使用 float 。也许您使用的是 64 位,但使用 float
而不是 double
?
关于python - 使用 ctypes 创建 Objective-C 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18804842/