Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调用glutWireSphere()时读取PyOpenGL访问冲突_Python_Pyqt_Access Violation_Pyopengl - Fatal编程技术网

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系统中没有出现这个错误。