私は以下の状況です。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 python が「例外タイプ: EXC_BAD_ACCESS (SIGSEGV)」でクラッシュする前に、インポート wx.glcanvas とインポート wx を移動しようとすると。このフレームは私の開始フレームではないため、他のモジュールで 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 がクラッシュするだけです。