2016-11-14 2 views
0

이전에 사용했던 wxPython/PyOpenGL 코드에서 먼지를 뽑아 내고 있었지만 더 이상 사용하지 않았습니다. 한 모듈 또는 다른 모듈에서 일부 업데이트 후에 작동이 중지 된 것 같습니다.wxPython/PyOpenGL 코드가 glPushMatrix에서 오류를 발생시키는 이유는 무엇입니까?

다음은 오류를 재현하는 작은 샘플 앱입니다.

import wx 
from wx import glcanvas 
from OpenGL.GLUT import * 
from OpenGL.GL import * 

class WxMyTestApp(wx.App): 
    def __init__(self): 
    wx.App.__init__(self) 
    def OnInit(self): 
    self.viewFrame = wx.Frame(None, -1, 'viewFrame', wx.DefaultPosition, (400,400)) 
    self.canvas = glcanvas.GLCanvas(self.viewFrame) 
    self.canvas.Bind(wx.EVT_PAINT, self.OnPaint) 
    return True 
    def OnPaint(self, ev): 
    print "OnPaint ", 
    dc = wx.PaintDC(self.canvas) 
    self.canvas.SetCurrent() 
    self.redraw(ev) 
    def redraw(self, ignoredEvent): 
    glPushMatrix() 
    glColor3f(1.0, 1.0, 0.0) 
    glLineWidth(1) 
    glutWireSphere(0.5, 10,10) 
    glPopMatrix() 
    glFlush() 
    self.canvas.SwapBuffers() 

if __name__ == '__main__': 
    d = WxMyTestApp() 
    d.viewFrame.Show() 
    d.MainLoop() 

테스트 코드를 실행 (내 실제 코드는 하나 개 이상의 창을 사용하기 때문에. 대신 wx.PySimpleApp의 wx.App를 사용하고 있습니다 주), 프레임이 왼쪽 상단 모서리에 작은 흰색 사각형을 보여줍니다 크기를 조정하면이 반복 오류가 발생합니다.

Traceback (most recent call last): 
    File "myTestApp.py", line 18, in OnPaint 
    self.redraw(ev) 
    File "myTestApp.py", line 20, in redraw 
    glPushMatrix() 
    File "C:\users\user\appdata\local\enthought\canopy\user\lib\site-packages\OpenGL\platform\baseplatform.py", line 402, in __call__ 
    return self(*args, **named) 
    File "C:\users\user\appdata\local\enthought\canopy\user\lib\site-packages\OpenGL\error.py", line 232, in glCheckError 
    baseOperation = baseOperation, 
OpenGL.error.GLError: GLError(
     err = 1282, 
     description = 'invalid operation', 
     baseOperation = glPushMatrix, 
     cArguments =() 

여기에 밀어 넣기를 수행하는 데 실제로 문제가 있습니까? 문제는 GL 장치 컨텍스트와 관련이 있지만 디버깅 방법을 모를 것으로 생각됩니다. Python 2.7.10, wxPython 3.0.2.0-3, PyOpenGL 3.1.0-2 (캐노피 배포판).

답변

0

나는 wxWidgets/wxPython Phoenix 노력으로 명백하게 생산 된 GLCanvasGLContext의 문서로부터 이익을 얻었습니다. 이전 버전의 wxWidgets가 암시 적으로 GLContext를 만들지 만 더 이상 사용되지 않을 것으로 보입니다. 이 정보를 사용하여 코드를 최신으로 유지할 수있었습니다. 내가 필요한 두 가지 변화가 있었다 :

OnInit에서

, self.canvas에 할당 한 후 행을 추가

self.canvas = glcanvas.GLCanvas(self.viewFrame) 
self.context = glcanvas.GLContext(self.canvas) # add this line 

다음 OnPaint 변화를이 라인 :

self.canvas.SetCurrent() 

을 여기에 :

self.canvas.SetCurrent(self.context) # add the argument 

이 작은 변경 사항은 내 코드를 다시 달리기. 희망을 다른 사람이 혜택을 누릴 수 있습니다.

관련 문제