2016-10-19 5 views
1

저는 리눅스에서 잘 작동하는 것처럼 보이는 jupyter notebook 기반 API를 개발했지만 일부에서는 제안 된이 오류가 발생하여 창문이 그려지지 않고 있습니다. , 또는 glClearColor()가 호출 될 때까지 컨텍스트가 존재하지 않는다.Windows에서 PyOpenGL glClearColor 오류가 발생했습니다.

리눅스 환경에서 처리 할 수있는 이유는 모르겠지만 Windows의 jupyter에는 문제가 없습니다.

제안 사항? 이것은 OpenGL의 버그입니까? 편집

C:\Python27\biovis\biovis\biovis\glwindow.py in initializeGL(self) 
    132 
    133   if self.background=='black': GL.glClearColor(0.0, 0.0, 0.0, 1.0) # Black/White toggle switch 
--> 134   if self.background=='white': GL.glClearColor(1.0, 1.0, 1.0, 1.0) 
    135 
    136   GL.glClearDepth(10.0) # same as default 

C:\Users\cm\Anaconda2\lib\site-packages\pyopengl-3.1.1a1-py2.7.egg\OpenGL\platform\baseplatform.pyc in __call__(self, *args, **named) 
    400  def __call__(self, *args, **named): 
    401   if self.load(): 
--> 402    return self(*args, **named) 
    403   else: 
    404    from OpenGL import error 

C:\Users\cm\Anaconda2\lib\site-packages\pyopengl-3.1.1a1-py2.7.egg\OpenGL\error.pyc in glCheckError(self, result, baseOperation, cArguments, *args) 
    230       result, 
    231       cArguments = cArguments, 
--> 232       baseOperation = baseOperation, 
    233     ) 
    234     return result 

GLError: GLError(
    err = 1282, 
    description = 'invalid operation', 
    baseOperation = glClearColor, 
    cArguments = (1.0, 1.0, 1.0, 1.0) 
) 

:

위의 몇 가지 코드를 추가 명확히하기 위해이 호출 체인 차례로 일부 데이터를로드하는 위젯을 호출 GLWindow 통과 명시 적으로 initializeGL(), updateGL는()를 호출 및 paintGL().

initializeGL()을 호출 할 때 오류가 발생하고 함수가 작동하지 않습니다. 위젯이 아직 플롯 할 준비가되지 않았습니까? 위젯이로드되면서 위젯이로드되지만 주석이 제대로 표시되지 않습니다. 화면이 검게 보이며 회전하는 동안에 만 그림이 깜박 거리는 것을 볼 수 있습니다 (회전 코드에 자체 updateGL() 호출이 있음).

어딘가에 show()가 없거나 함수가 잘못되었습니다. 그런데 왜 리눅스 환경은 윈도우가 아닌 ok입니까? (어쩌면 설치된 모듈 버전은 약간 다릅니다?)

class GLWindow(QtGui.QWidget): 

    def __init__(self, fig, parent=None): 
     QtGui.QWidget.__init__(self, parent) 

     self.glWidget = GLWidget(fig, parent=self) 

     mainLayout = QtGui.QHBoxLayout() 
     mainLayout.addWidget(self.glWidget) 

     self.setLayout(mainLayout) 
     self.setWindowTitle(self.tr("Biovis")) 

     self.show() 

class GLWidget(QtOpenGL.QGLWidget): 

    def __init__(self, fig, parent=None): 
     QtOpenGL.QGLWidget.__init__(self, parent) 

     self.setFocusPolicy(Qt.StrongFocus) 
     self.lastPos = QtCore.QPoint() 

     self.load_data_from_fig(fig) 
     format = QtOpenGL.QGLFormat() 

     format.setDoubleBuffer(True) # works fine 
     self.setFormat(format) 

    def load_data_from_fig(self, fig): 

     self.background = fig.background 
    ... 

     self.initializeGL() #Can comment these out and code works, but, the screen is black and the figure flickers in/out of existence while rotating 
     self.updateGL() 
     self.paintGL() 

    def initializeGL(self): 

     GL.glClearColor(1.0, 1.0, 1.0, 1.0) 
     GL.glClearDepth(10.0) # same as default 
     GL.glEnable(GL.GL_DEPTH_TEST) # 
    ... 
+0

이 문제를 복제하는 짧은 코드 샘플을 게시 할 수 있습니까? GLError 1282는 꽤 일반적이고 많은 도움이되는 정보를 제공하지 않습니다. glClearColor를 호출하기 전에 OpenGL이 렌더링 할 창을 이미 만들었다 고 추측합니다. 어떻게 그 창을 만들고 OpenGL을 설정하고 있습니까? – CodeSurgeon

+0

좋아, 코드 덩어리를 업로드했다. 도움이 되길 바랍니다. –

+0

죄송합니다. 지금은 단지 그것을보고 있습니다. qt4 또는 qt5를 사용하고 있습니까? 이 리눅스에서 실행되도록 노력하고 있지만 올바르게 PyQt4 가져 오기 QtOpenGL 및 qglwidget 가져 오기 함께 고군분투입니다. – CodeSurgeon

답변

0

아래는 윈도우와 리눅스 모두에서 성공적으로 간단한 삼각형을 렌더링 pyqt4의 OpenGL을 데모입니다. 이 *GL 명령이 자동으로 pyqt 라이브러리로 정의되고 호출되므로 나는 self.paintGL() 또는 그와 비슷한 것을 호출하지 않는다는 것에주의하십시오.

import sys 
import math 
from PyQt4 import QtCore, QtGui, QtOpenGL 
from OpenGL.GL import * 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.glWidget = GLWidget() 
     mainLayout = QtGui.QHBoxLayout() 
     mainLayout.addWidget(self.glWidget) 
     mainLayout.setContentsMargins(0,0,0,0) 
     self.setLayout(mainLayout) 
     self.setWindowTitle("Biovis") 

class GLWidget(QtOpenGL.QGLWidget): 
    def __init__(self, parent=None): 
     super(GLWidget, self).__init__(parent) 

    def minimumSizeHint(self): 
     return QtCore.QSize(200, 200) 

    def sizeHint(self): 
     return QtCore.QSize(400, 400) 

    def initializeGL(self): 
     glClearColor(1, 0, 0, 1) 

    def paintGL(self): 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
     glBegin(GL_TRIANGLES) 
     glVertex(-1, -1, 0) 
     glVertex(0, 1, 0) 
     glVertex(1, -1, 0) 
     glEnd() 

    def resizeGL(self, width, height): 
     glMatrixMode(GL_PROJECTION) 
     glLoadIdentity() 
     glViewport(0, 0, width, height) 
     glOrtho(-1, 1, -1, 1, -1, 1) 
     glMatrixMode(GL_MODELVIEW) 
     glLoadIdentity() 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 

성공적으로 실행되면 알려주세요.

+0

안녕 감사에서 PyQt4 수입 QtCore, PyQt4.QtCore 수입 Qt는 에서 QtGui, QtOpenGL 에서 glwindow 수입 GLWindow 에서 . 불행하게도 두 클래스에서 생성자를 변경하면 이전과 같은 오류가 발생합니다. 난 정말 뭔가 더 복잡한 윈도우 또는 일부 OpenGL 라이브러리와 pyqt 버전 호환성과 관련이 있다고 생각 ... 그것은 일들이 어떤 이유로 Windows에서 주문 불리는 것 같습니다. –

+0

@ 고양이 당신은 아마 맞을 것입니다. 위의 코드를 Windows XP 32 비트 VirtualBox VM에서 테스트했습니다. Python.org 웹 사이트에서 설치된 python 2.7.12를 사용하여 코드를 실행했습니다. PyOpenGL은'python -m pip install pyopengl'을 통해 설치되었습니다. 나는 Windows 용 Qt 온라인 설치 프로그램을 사용하여 QT 5.6/5.7을 설치했고 기본값을 따라 파이썬과 QT 모두에 필요한 PATH 변수를 추가했습니다. 미리 만들어진'PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe'를 사용하여 pyqt4를 설치했습니다.이 파일은 [here] (https://www.riverbankcomputing.com/software/pyqt/)에서 찾을 수 있습니다. 다운로드). 설정은 어떻게됩니까? – CodeSurgeon

+0

안녕하세요. 글쎄, 나는 창문에서 모든 설치가 완료된 Windows 8.1 pro에서 코드를 테스트했다. 확인하고 테스트 할 수있는 많은 매개 변수가있을 수 있지만 제 동료는 Windows 10 컴퓨터에서 동일한 문제가 있습니다 (제 생각 엔). 그는 실수로 저를 배려 한 사람입니다. 나는 코드가 다르게 작동하지 않는다는 것을 전혀 몰랐습니다. 나는 MacOS가 1 년 전에 유사한 opengl 루틴을 돌리려고 할 때 몇 가지 문제가 있었다는 사실을 기억한다. 나는 아마도 더 잘 알지도 모르는 macOS 또는 windows opengl 사람이 필요할 것이다. 다시 한번 감사드립니다. catubc –