Python 调用glutWireSphere()时读取PyOpenGL访问冲突
我正在Python 调用glutWireSphere()时读取PyOpenGL访问冲突,python,pyqt,access-violation,pyopengl,Python,Pyqt,Access Violation,Pyopengl,我正在Python3.5.2 应用程序的目的是使用QGLWidget类设置一个窗口,并使用glutWireSphere函数绘制一个球体。代码在我的ubuntulinux 16.04 LTS笔记本电脑上运行良好,但在我的windows7桌面上,它在OSError:exception:access违例读取0x00000000000000C1行glutWireSphere时崩溃。如果我注释掉这一行,程序将正常执行。我尝试了一个不同的代码示例(下面的示例),演示了如何使用glut绘制球体,但它没有被压碎
Python3.5.2
应用程序的目的是使用QGLWidget
类设置一个窗口,并使用glutWireSphere
函数绘制一个球体。代码在我的ubuntulinux 16.04 LTS
笔记本电脑上运行良好,但在我的windows7
桌面上,它在OSError:exception:access违例读取0x00000000000000C1
行glutWireSphere
时崩溃。如果我注释掉这一行,程序将正常执行。我尝试了一个不同的代码示例(下面的示例),演示了如何使用glut
绘制球体,但它没有被压碎,而是使用glut
管理窗口
我的代码:
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
from PyQt5.QtOpenGL import *
from PyQt5 import QtGui
from PyQt5 import QtWidgets
from PyQt5 import QtCore
class MyWidget(QGLWidget):
def __init__(self, parent = None):
super(MyWidget, self).__init__(parent)
self.cameraDistanceZ = 10
def paintGL(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glColor3f(0.33, 0.33, 0.33)
glutSolidSphere(1, 20, 20)
def resizeGL(self, w, h):
glViewport(0, 0, w, h)
self.setOrthoProjection()
self.screenCenterX = w/2
self.screenCenterY = h/2
def setOrthoProjection(self):
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
w = self.width()
h = self.height()
glOrtho(-10, 10, -10, 10, -5.0, 15.0)
gluLookAt(0,0,self.cameraDistanceZ, 0,0, -10, 0,1,0)
def initializeGL(self):
print("Start init process")
glutInit(sys.argv)
glClearColor(0.0, 0.0, 0.1, 0.0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glClearDepth(1.0)
self.updateGL()
def main():
app = QtWidgets.QApplication(["To parathyro"])
widget = MyWidget()
widget.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
工作示例:
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
import sys
def main():
glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(400,400)
glutCreateWindow(b"myWindow")
glClearColor(0.,0.,0.,1.)
glShadeModel(GL_SMOOTH)
glEnable(GL_CULL_FACE)
glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
lightZeroPosition = [10.,4.,10.,1.]
lightZeroColor = [0.8,1.0,0.8,1.0] #green tinged
glLightfv(GL_LIGHT0, GL_POSITION, lightZeroPosition)
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor)
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1)
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05)
glEnable(GL_LIGHT0)
glutDisplayFunc(display)
glMatrixMode(GL_PROJECTION)
gluPerspective(40.,1.,1.,40.)
glMatrixMode(GL_MODELVIEW)
gluLookAt(0,0,10,
0,0,0,
0,1,0)
glPushMatrix()
glutMainLoop()
return
def display():
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
glPushMatrix()
color = [1.0,0.,0.,1.]
glMaterialfv(GL_FRONT,GL_DIFFUSE,color)
glutWireSphere(1,20,20)
glPopMatrix()
glutSwapBuffers()
return
if __name__ == '__main__': main()
如果我尝试绘制其他内容,例如glutSolidSphere
,我会得到相同的错误,但位于不同的地址。我在网上发现的所有访问冲突错误都是特定于应用程序的,它们大多与某些函数中的错误输入类型有关。在我的应用程序中,这样的错误没有太大的空间,因为我代码中的函数没有太多参数,或者有一些我还没有注意到的东西
对于我的windows7
桌面系统,我从官方网站下载了python3.5.2
,根据说明使用pip
和PyOpenGL
安装了PyQt5
我认为这与freeglut
库中的问题有关,但它适用于不同的示例。我想这与我如何在应用程序中初始化freeglut
有关,或者与PyQT5
问题
我如何跟踪问题并解决它,而不转移到我的应用程序的不同体系结构?似乎发生崩溃是因为glutWireSphere要求您首先调用glutCreateWindow,请查看以下小片段,例如:
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
from PyQt5.Qt import * # noqa
class MyWidget(QGLWidget):
def __init__(self, parent=None):
super().__init__(parent)
def paintGL(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glPushMatrix()
color = [1.0, 0., 0., 1.]
glMaterialfv(GL_FRONT, GL_DIFFUSE, color)
glutWireSphere(1, 20, 20)
glPopMatrix()
glutSwapBuffers()
def glutInitialization(self):
glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(400, 400)
glutCreateWindow(b"Glut Window")
def initializeGL(self):
glClearColor(0., 0., 0., 1.)
glShadeModel(GL_SMOOTH)
glEnable(GL_CULL_FACE)
glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
lightZeroPosition = [10., 4., 10., 1.]
lightZeroColor = [0.8, 1.0, 0.8, 1.0] # green tinged
glLightfv(GL_LIGHT0, GL_POSITION, lightZeroPosition)
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor)
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1)
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05)
glEnable(GL_LIGHT0)
glMatrixMode(GL_PROJECTION)
gluPerspective(40., 1., 1., 40.)
glMatrixMode(GL_MODELVIEW)
gluLookAt(0, 0, 10,
0, 0, 0,
0, 1, 0)
glPushMatrix()
self.glutInitialization()
def main():
app = QApplication(["To parathyro"])
widget = MyWidget()
widget.setWindowTitle("Pyqt Widget")
widget.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
您可以看到球体将如何显示在pyqt窗口(活动gl上下文)中。然后,注释glutCreateWindow(b“Glut窗口”)并再次运行它,这样您将看到seg故障崩溃再次出现
我的建议?如果不使用glut作为opengl窗口管理系统,我不会依赖glut几何函数
顺便说一句,生成一个球体一点也不重要,值得你试一试:)关于如何使这个问题更清楚,有什么建议吗?我不知道解决方案,但我能够重现PyQt5和Py3上的过量的完全相同的问题(因此,它可能与该工具链有关)我猜这与PyQt5如何设置过量有关,或者两者之间存在某种内存管理不善。我在Qt文档中读到QGL小部件贬值,应该使用QOpenGLWidget,但结果是一样的。是的。。。就我个人而言,我会尽量不使用glut(依赖性的麻烦对我来说不值得,但我确信如果你在调试模式下编译freeglut并在调试器中执行步骤,你将能够诊断问题)。但如何从那里开始呢?或者你是说别的什么?谢谢,顺便问一下,我很好奇为什么Linux系统中没有出现这个错误。