2016-11-14 4 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.App代わりのwx.PySimpleAppを使用しています。)、フレームは、左上隅にある小さな白い四角形を示しており、リサイズ時にこの繰り返しエラーを与える:

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(Canopyディストリビューション)。

答えて

0

私は、明らかにwxWidgets/wxPython Phoenixの努力の下で作成されたGLCanvasGLContextのドキュメントの恩恵を受けました。以前のバージョンのwxWidgetsが暗黙のうちにGLContextを作成すると思われますが、これは推奨されていません。この情報を使って、コードを最新のものにすることができました。私は必要な2つの変更があった。

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 

これらの小さな変更が私のコードを手に入れました。もう一度走る。誰かがこれで恩恵を受けることを願っています。

関連する問題