我开发了一个基于jupyter笔记本的api,似乎在linux中运行良好,但是在Windows中我得到了这个错误,有些人提出这个错误与没有上下文被绘制,或者没有调用glClearColor()时的上下文。
不确定为什么linux环境可以处理它,但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调用Widget,后者又加载一些数据并显式调用initializeGL(),updateGL()和paintGL()。
当调用initializeGL()并且没有任何函数可用时,会发生错误,也许小部件尚未准备好进行绘制?如果我评论这3个调用小部件确实加载但没有正确显示:屏幕是黑色的,只有在旋转它时我才能看到图形闪烁(旋转代码有它自己的updateGL()调用)。
我在某个地方错过了一个节目(),或者无序地调用了函数?但是为什么linux环境可以用它而不是windows? (也许安装的模块版本略有不同?)
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 :(得分:0)
下面是一个pyqt4 opengl演示,它在windows和linux上成功呈现一个简单的三角形。请注意,我不会调用self.paintGL()
或类似的内容,因为这些*GL
命令已定义并自动调用pyqt库。
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_())
让我知道这是否成功为您服务!