使用ctypes创建ObjectiveC结构?

2024-04-29 06:01:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Python ctypes从苹果的CoreGraphics库创建CGRect结构。在

CoreGraphics/CGBase.hCGRect的内部定义如下:

/* 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中,我尝试用以下代码重新创建结构:

^{pr2}$

这似乎奏效了。我可以检查它并给它赋值。在

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   

我没有正确地设置结构。。?在


Tags: 苹果sizeoriginctypeswidth结构structcoregraphics
2条回答

您可以在pyObjc中使用元组,只需(123456)而不是结构包(QQ,123456)

如果打开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可以是浮点型,也可以是双精度型,这取决于您运行的是32位还是64位。你正在使用浮动。也许您使用的是64位,但是使用float而不是{}?在

相关问题 更多 >