gpt4 book ai didi

python - 为什么我的 PyObjc Cocoa View 类忘记了它的字段?

转载 作者:太空宇宙 更新时间:2023-11-04 09:22:21 25 4
gpt4 key购买 nike

我试图破解一个工具来为我的游戏可视化着色器,我想我会尝试使用 python 和 cocoa。不过,我遇到了各种各样的砖墙。也许我对 objective-c 的理解有点差,但我似乎无法为我试图编写的 View 获取这段代码:

from objc import YES, NO, IBAction, IBOutlet
from Foundation import *
from AppKit import *
import gv

class SceneView(NSOpenGLView):
def __init__(self):
NSOpenGLView.__init__(self)
self.renderer = None

def doinit(self):
self.renderer = gv.CoreRenderer()


def initWithFrame_(self, frame):
self = super(SceneView, self).initWithFrame_(frame)

if self:
self.doinit()
print self.__dict__

return self

def drawRect_(self, rect):
clearColor = [0.0,0.0,0.0,0.0]
print self.__dict__
self.renderer.clear(CF_Target|CF_ZBuffer,clearColor)

执行时输出:

{'renderer': <gv.CoreRenderer; proxy of <Swig Object of type 'GV::CoreRenderer *' at 0x202c7d0> >}
{}
2009-04-03 19:13:30.941 geom-view-edit[50154:10b] An exception has occured:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/PyObjCTools/AppHelper.py", line 235, in runEventLoop
File "/mnt/gilead/amcharg/projects/geom-view-edit/build/Debug/geom-view-edit.app/Contents/Resources/SceneView.py", line 37, in drawRect_
self.renderer.clear(CF_Target|CF_ZBuffer,clearColor)
AttributeError: 'SceneView' object has no attribute 'renderer'

它似乎丢失了我的渲染器变量,考虑到 initWithFrame_ 代码多么时髦,这并不奇怪,但这是 xcode 似乎写的东西,我认为这是有道理的,因为 objective-c 的 init 与 alloc 习惯用法分开。然而,看到它 python 仍然很奇怪。

有没有办法挽救这个,或者我应该把它从代码后面拿出来射它并使用 QT 或 wxPython?我考虑过使用 objective-c,但我想测试一下我刚刚编译的这些漂亮的 swig 绑定(bind) =)

最佳答案

根据您应用中其他地方发生的情况,您的实例实际上可能会被复制。

在这种情况下,实现 copyWithZone 方法以确保新副本也获得渲染器。 (注意,虽然我是一名 Python 开发人员和一名 Objective-C cocoa 开发人员,但我自己并没有使用过 PyObjC,所以我不能肯定地说你是否应该实现 copyWithZone__copy__).

事实上,通过打印将 copyWithZone 方法推送到类中,您可以判断是否正在调用该方法,以及这是否是渲染器似乎消失的原因。


编辑:根据您的反馈,我已将您的代码粘贴到一个空白的 xcode python 项目中(只是用其他东西代替 gv.CoreRenderer,因为我没有),然后它稍作修改即可正常工作。您如何实例化 SceneView?

就我而言:

  • 使用 Cocoa-Python 模板创建了一个空白的 xcode 项目
  • 创建了一个名为 SceneView.py 的新文件。我粘贴了你的代码。
  • 打开 MainMenu.xib 文件,然后将一个 NSOpenGLView 框拖到窗口上。
  • 选中 NSOpenGLView 框后,我转到属性检查器并将框的类更改为 SceneView
  • 回到 xcode,我在 main.py 的导入中添加了 import SceneView,以便在加载 xib 文件时可以使用该类
  • 我在 SceneView.py 中实现了一个 awakeFromNib 方法来处理 self.renderer 的设置。请注意,在程序执行期间不会为 nib 对象调用 __init__initWithFrame...它们被视为“序列化”到 nib 文件中,因此已经实例化。我掩盖了一些细节,但这就是 awakeFromNib 存在的原因。
  • 一切正常运行。 __dict__drawRect_ 调用中有适当的值,等等。

这是 awakeFromNib 函数:

def awakeFromNib(self):
print "Awake from nib"
self.renderer = gv.CoreRenderer()

所以,我猜在您的对象实例化和/或添加到 View 的过程中,只有一些交叉线。您是为您的对象使用 Interface Builder,还是手动创建它并稍后将其添加到 View 中?我很想知道您从 initWithFrame 获取登录输出,这就是为什么我要问您如何创建 SceneView。

关于python - 为什么我的 PyObjc Cocoa View 类忘记了它的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/716386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com