2009-04-04 3 views
1

나는 내 게임을위한 쉐이더를 시각화하기위한 도구를 해킹하려고 시도 했었고 파이썬과 코코아를 사용하려고 시도했다. 나는 벽돌 벽에 부딪쳤다. 아마도 그 객관적인 C의 이해하지만 난 작업을 작성하려고 한 볼이 코드를 얻을 수없는 것 다소 빈약 한 내 : 실행될 때PyObjc 코코아 뷰 클래스가 필드를 잊어 버리는 이유는 무엇입니까?

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_ 코드가 얼마나 펑키한지 생각해 보면 그리 놀랍지 않은 렌더러 변수를 잃어 버릴 수 있습니다.하지만 이것은 객관적인 C가 alloc 이디엄과 별도로 init를 가지고 있기 때문에 xcode가 생각하는 것처럼 보였습니다. 그러나 여전히 파이썬을 보는 것은 이상합니다.

어쨌든 이것을 구제 해줄 것인가? 아니면 코드 창고에서 QT 또는 wxPython을 사용해야합니까? 나는 목표 - C를 사용하여 생각하지만, 난 그냥 컴파일이 멋진 꿀꺽 꿀꺽 바인딩 =)

+0

나는 wxPython을 사용한다고 말하고 나서 리눅스 boxen에서도 실행할 수있다. :-) – Benson

+0

나는 wxPython을 보았다. 그렇다면 나는 눈을 피우지 않기 위해 몇 가지 조언을해야만했다. 나는 그것을 최후의 수단으로 사용할 것이다. –

답변

3

이 앱에서 다른 곳에서 무슨 일이 일어나고 있는지에 따라 인스턴스가 실제로 복사하기 수 있습니다을 테스트하려는.

이 경우 copyWithZone 메서드를 구현하여 새 복사본에도 렌더러가 적용되도록하십시오. (주의 할 점은 Python 개발자이자 Objective-C 코코아 개발자인데 PyObjC를 직접 사용하지 않았기 때문에 copyWithZone 또는 __copy__을 구현해야한다고 분명히 말할 수는 없다.

실제로 인쇄를 사용하여 copyWithZone 메서드를 클래스에 추가하면 메서드가 호출되는지 여부와 렌더러가 사라진 것처럼 보이는 이유를 알 수 있습니다.


편집 : 귀하의 의견에 대한 자료, 나는 빈 엑스 코드 파이썬 프로젝트 (나는 그것을하지 않기 때문에 그냥 gv.CoreRenderer에 대한 뭔가 다른 대체)에 코드를 붙여 넣은, 그것은 작동 약간의 사소한 변경으로 괜찮습니다. 어떻게 SceneView를 인스턴스화합니까? 코코아 - 파이썬 템플릿 SceneView.py라는 새로운 파일을 생성

  • 를 사용하여 빈 Xcode 프로젝트를 만든

    • : 내 경우 I에서

      . 코드에 붙여 넣었습니다.

    • 파일을 열어 MainMenu.xib 파일을 열고 NSOpenGLView 상자를 창으로 끌었습니다. 클래스를 사용할 것입니다 수 있도록 선택한 NSOpenGLView 상자
    • , 내가 속성 관리자에 가서 돌아 가기 엑스 코드에서
    • SceneView에있는 상자의 클래스를 변경, 나는 main.py의 수입에 import SceneView을 추가 할 때 XIB 파일 가로드되었습니다
    • 을 처리하기 위해 SceneView.pyawakeFromNib 메서드를 구현했습니다. __init__initWithFrame은 프로그램 실행 중에 nib 객체에 대해 호출되지 않습니다. nib 파일에 "직렬화 된"것으로 간주되므로 이미 인스턴스화됩니다. 나는 약간의 세부 사항에 광택이 나있다. 그러나 이것이 awakeFromNib가 존재하는 이유이다.
    • 모든 것이 실행 중입니다.__dict__에는 drawRect_ 호출에 적절한 값이 있습니다. 그냥 넘어 선이 어딘가에 객체 인스턴스화 및/또는 뷰에 추가되는 방식에있다 그래서, 내가 추측하고있어

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

      :

    은 여기로 awakeFromNib 기능입니다. 개체에 Interface Builder를 사용하고 있습니까, 아니면 수동으로 만들고 나중에보기에 추가합니까? initWithFrame에서 로그 아웃 결과를 얻고 있는지 궁금 해서요. 그래서 SceneView를 만드는 방법을 묻는 것입니다.

  • +0

    이것들은 도움이되지 않는 것 같습니다 : (나는 렌더러 필드를 추가하여 구성하면 마술처럼 사라집니다.) 어떤 방법으로도 메소드가 남아있는 것처럼 보입니다 –

    +0

    awakeFromNib 코드가 트릭을했습니다! 감사합니다! –

    2

    직렬화되지 않은 경우에도 Python의 __init__ 생성자는 ObjectiveC-bridge에서 지원되지 않습니다. 그래서 예를 들어 과부하가 필요합니다. initWithFrame : 자체 생성보기 용.

    +0

    감사합니다. ... 다리에 대한 지식이있는 구멍을 막아 주셔서 감사합니다. –

    +0

    내 대답을 다시 읽는 것을 잊지 마십시오. 마크 다운 형식이 내 이중 밑줄을 죽였다는 사실을 알았습니다. :) – deets

    +0

    처음에 나는 문제는 생성자가 없지만 제거하고 좀 더 시도해 보겠습니다. –

    관련 문제