【问题标题】:wxPython, OpenGL.GLU import ordering matters?wxPython、OpenGL.GLU 导入排序是否重要?
【发布时间】:2011-05-25 17:11:45
【问题描述】:

我处于以下情况。我有一个带有 GLCanvas 的模块,一个包含画布和一些按钮的 wx.Panel 以及一个显示它们的框架。现在我的导入如下:

从 OpenGL.GLU 导入 gluPerspective 从 OpenGL.GLUT 导入 glutSolidSphere

from OpenGL.GL import GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_LEQUAL, GL_DEPTH_TEST, GL_SMOOTH, GL_PROJECTION
from OpenGL.GL import GL_LIGHTING, GL_LIGHT0, GL_POSITION, GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_LIGHT_MODEL_TWO_SIDE
from OpenGL.GL import GL_MODELVIEW,GL_TRIANGLES,GL_POINTS,GL_UNSIGNED_SHORT,GL_UNSIGNED_INT,GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST
from OpenGL.GL import glClear, glLoadIdentity, glTranslatef, glTranslate, glRotatef, glRotate, glColor4f, glClearColor, glClearDepth, glDepthFunc, glEnable
from OpenGL.GL import glViewport, glShadeModel, glMatrixMode, glDrawElements, glHint, glLightfv , glLightModeli
from wx.glcanvas import GLCanvas
import wx

这很好用。但是,如果我尝试在从 GLU 和 GLUT 的导入之前移动导入 wx.glcanvas 并导入 wx,则会出现“异常类型:EXC_BAD_ACCESS (SIGSEGV)”崩溃。由于这个框架不是我的起始框架,我必须在其他模块中调用 import wx ,当我到达这个框架时它就会崩溃。有什么建议么 ?

编辑

所以为了更好地解释问题。我的 GLCanvas、GLPanel 和 MainWindow 有模块 1:

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

class myGLCanvas(GLCanvas):
---------some initialisations and stuff-------
#Actual draw
def OnDraw(self):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()                    
    glTranslatef(0.0, -5.0, -250.0)
    glTranslate(0.0, 0.0, -self.distance)
    glRotate(self.alpha, 0.0, 0.0, 1.0)
    glRotate(self.beta, 0.0, 1.0, 0.0)
    for b in self.dataBuffers:  
        b.bindAll()
        glDrawElements(self.glDisplayType, b.size, GL_UNSIGNED_INT, 0)
        b.unbind() 
    self.SwapBuffers()
-------------------more code------------------
================End of class GLCanvas=======================

class GLPanel(wx.Panel):
def __init__(self, parent, canvas, *args, **kwargs):
    wx.Panel.__init__(self, parent, *args, **kwargs)
    self.canvas = canvas

    self.button1 = wx.Button(self, label="POINTS")
    self.button2 = wx.Button(self, label="TRIANGLES")

    self.Bind(wx.EVT_BUTTON, self.setPoints, self.button1)
    self.Bind(wx.EVT_BUTTON, self.setTriangles, self.button2)

    self.sizer = wx.BoxSizer(wx.VERTICAL)
    self.sizer.Add(self.button1, flag=wx.BOTTOM, border=5)
    self.sizer.Add(self.button2, flag=wx.BOTTOM, border=5)


    self.border = wx.BoxSizer()
    self.border.Add(self.sizer, flag=wx.ALL | wx.EXPAND, border=5)

    self.SetSizerAndFit(self.border)

def setPoints(self, evt):
    self.canvas.setDisplayType(GL_POINTS)
    #-----------------------------------------------------------------------------------------------
def setTriangles(self, evt):
    self.canvas.setDisplayType(GL_TRIANGLES)
 ======================End of GLPanel========================= 
class MainWin(wx.Frame):
def __init__(self, *args, **kwargs):
    wx.Frame.__init__(self, title='OpenGL', *args, **kwargs)

    self.canvas = myGLCanvas(self, size=(640, 480))
    self.panel = GLPanel(self, canvas=self.canvas)

    self.sizer = wx.BoxSizer()
    self.sizer.Add(self.canvas, 1, wx.EXPAND)
    self.sizer.Add(self.panel, 0, wx.EXPAND)
    self.SetSizerAndFit(self.sizer)

    self.Show()

好的,如果我继续,那么现在:

 app = wx.PySimpleApp(0)
 wx.InitAllImageHandlers() 
 main_win = MainWin(None)
 main_win.Show()
 app.MainLoop()

如果我从同一个模块或以前不使用任何 import wx 的模块执行此操作,它可以工作。但是我的应用程序有一个登录屏幕、配置屏幕等都使用 wx。所以现在在我想要创建 MainWin() 的代码中,我遇到了我之前提到的崩溃。

基本上我的意思是我必须从以下位置创建一个 GLPanel 和 myGLCanvas:

import wx

class someOtherScreen(wx.Frame)
--------------code code-------------
canvas = myGLCanvas

所以现在 wx 在 OpenGL 导入和 python 崩溃之前出现。

【问题讨论】:

  • 作为一个新用户很难知道这一点,但是当你想为你的问题添加新信息时,你应该通过编辑它来做到这一点(在你的问题的最底部有一个编辑链接) ,而不是在答案中发布。

标签: opengl wxpython pyopengl


【解决方案1】:

我正在这样做:

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

这应该适用于任何应用程序。

【讨论】:

  • 如果这是起始模块,这可以正常工作。但是假设我有我的 GLModule,其中我有你说的导入。但是我的登录框架使用的是 wx,所以我必须在那里导入 wx。现在,如果我尝试执行类似 main_win = GLWindow(None) app.SetTopWindow(main_win) app.MainLoop() 它仍然崩溃
  • 这就像我的解决方案一样。意思是如果我尝试类似:
  • 请在您的问题中添加最小示例(可能分为两个文件),以说明问题。
  • 最终修复了它。这是我和一些有问题的 pyopengl VBO 的一些坏指数的累积。感谢您的意见。
猜你喜欢
  • 2012-02-27
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 2011-07-04
相关资源
最近更新 更多