python - 使用 ctypes 创建 Objective-C 结构?

标签 python macos ctypes

我正在尝试使用 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/

相关文章:

python - ctypes - 从 C 到 python 对象的引用

python - 当我在 mac 上安装了 python 3.5 时,终端运行 python 2.7。

python - 如何使用 PyQuery 从元标记获取内容值?

python - django-celery 或 python 的奇怪错误

macos - 全局 "BackgroundChanged"通知在 10.7.4 下无响应

Python:SWIG 与 ctypes

python - 在 NLTK 中找不到 ghostscript?

python - 如何修复编程错误 : (1064,“您的 SQL 语法有错误)?

macos - 如何在 NSTextField 中添加 Cocoa 控件?

python - 如何使用 boost.python 将预填充的 "unsigned char*"缓冲区传递给 C++ 方法?