来自 wxPython 的 NSView*

Posted

技术标签:

【中文标题】来自 wxPython 的 NSView*【英文标题】:NSView* from wxPython 【发布时间】:2015-06-23 22:51:29 【问题描述】:

我正在开发一个 Python 模块,该模块需要获取指向 NSView 的指针,以便将 OpenGL 附加到窗口。

我使用 wxPython 作为 GUI 库,它有一个 GetHandle() 方法,正如文档所述,“返回物理窗口的特定于平台的句柄(作为长整数)”。

因为我的模块必须与 Windows 和 Mac 兼容,所以我制作了一个包装函数,它需要一个 unsigned long 并将其强制转换为 void*,以便将它传递给处理 OpenGL 创建的实际方法。

void wrap_CreateContext(unsigned long windowId)

    return CreateContext((void*)&(windowId));

在 Windows 上一切正常,但在 Mac 上,当我尝试将 void* 转换为 NSView* 然后使用该 NSView* 时,调试器给我一个 EXC_BAD_ACCESS 错误。

这就是我将 void* 转换为 NSView* 的方式:

void CreateContext(void* windowId)

    NSView* view = (NSView*)windowId;

    // for example I try to get the view size
    NSSize size = view.frame.size; // <--- EXC_BAD_ACCESS error

我真的不知道问题出在我从 unsigned long 到 void* 然后从 void* 到 NSView* 的转换中,还是问题出在其他地方。

我正在使用的 wxPython 版本是基于 Cocoa 构建的,因此我应该从 GetHandle() 获取指向 NSView 的指针。

【问题讨论】:

【参考方案1】:

找到了解决办法。问题在于我从 long 转换为 void* 并返回 NSView*。

直接从 long 投射到 NSView* 效果很好。

【讨论】:

去掉wrap_CreateContext()中的“&”

以上是关于来自 wxPython 的 NSView*的主要内容,如果未能解决你的问题,请参考以下文章

设置上的wxpython错误 - ModuleNotFound:没有名为'wx'的模块

python桌面开发,为啥选择PyQt或wxPython,而不使用Tkinter?

使用来自 XIB 的自定义 NSView/UIView 子类?

在几个 NSView 之间交替

wxPython wxDC 对象来自 win32gui.GetDC

wxPython事件处理