wxPython, OpenGL.GLU порядок импорта имеет значение? - PullRequest
0 голосов
/ 23 мая 2011

Я в следующей ситуации. У меня есть модуль с GLCanvas, wx.Panel, который содержит холст и некоторые кнопки и рамку, которая отображает их. Теперь мой импорт выглядит следующим образом:

из OpenGL.GLU import 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

Это отлично работает. Однако, если я попытаюсь переместить импорт wx.glcanvas и импортировать wx до того, как импорт из GLU и GLUT python завершится с ошибкой «Тип исключения: EXC_BAD_ACCESS (SIGSEGV)». Поскольку этот фрейм не будет моим начальным фреймом, мне придется вызывать import wx в других модулях, и когда я его достигну, он просто вылетит. Какие-либо предложения ?

Редактировать

Итак, чтобы лучше объяснить проблему. У меня есть модуль 1 с моими GLCanvas, GLPanel и MainWindow:

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()

Если я делаю это из того же модуля или из модуля, который ранее не использовал импорт wx, это работает. Но у моего приложения есть экран входа в систему, экран конфигурации и т. Д., Которые все используют wx. Итак, теперь в моем коде, который я хочу создать MainWin (), я получаю сбой, о котором упоминал ранее.

В основном я говорю о том, что мне нужно создать GLPanel и myGLCanvas из:

import wx

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

Так что теперь wx предшествует импорту OpenGL, а python просто падает.

1 Ответ

0 голосов
/ 23 мая 2011

Я делаю это:

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

Это должно работать нормально для любого приложения.

...