【问题标题】:Why does this wxPython/PyOpenGL code raise an error on glPushMatrix?为什么这个 wxPython/PyOpenGL 代码会在 glPushMatrix 上引发错误?
【发布时间】:2017-03-28 06:47:08
【问题描述】:

我正在清理一些曾经运行但不再运行的 wxPython/PyOpenGL 代码——显然它在一个或另一个模块中进行了一些更新后停止工作,我不知道什么时候。

这是一个重现错误的小示例应用程序。

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 分布)。

【问题讨论】:

    标签: python wxpython pyopengl


    【解决方案1】:

    我受益于 GLCanvasGLContext 的文档,这些文档显然是在 wxWidgets/wxPython Phoenix 的努力下产生的。似乎早期版本的 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
    

    这些小改动让我的代码重新启动并运行。希望其他人可以从中受益。

    【讨论】:

      猜你喜欢
      • 2016-07-10
      • 2016-02-03
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多