2016-07-28 1 views
0

私はthe PyQt5 helloGL example codeをコンパイルしようとしています。私は解決策を構築しようとした際、私が取得:PyQt5のOpenGLモジュールの問題とバージョン管理(不正な_QOpenGLFunctions_(ver)の呼び出し)

Traceback (most recent call last): 
    File "C:\Users\\-PATH-\trunk\view\test.py", line 142, in initializeGL 
    self.gl = self.context().versionFunctions() 
ImportError: No module named 'PyQt5._QOpenGLFunctions_4_3_Compatibility' 
[Finished in 0.3s] 

私PyQt5フォルダで、私が持っている:

_QOpenGLFunctions_4_1_Core.pyd 
_QOpenGLFunctions_2_0.pyd 
_QOpenGLFunctions_2_1.pyd 

異なるバージョンのQOpenGLFunctionsの私のセットとして。私は、バージョンファンクション()の呼び出しが、4_1_Coreファイルを使用するように強制することができるかどうかを調べるために、何も役に立たないようにする方法を探しました。私は2回再起動してPyQt5を2回再インストールしましたが、これは奇妙なレジストリの不具合であるかどうかを確認するためです - これは、私のグラフィックスドライバを更新して、OpenGLの正しいバージョンが私のシステム上にあっても問題が発生しました)

PyOpenGLがインストールされ、更新されました。私も再インストールしました。

最終的な目標は、OpenGLレンダラをQtウィンドウに埋め込むことですが、私はPythonでそれを行う方法について多くの例は見つけられていません。私はしばらくの間Vispyを使用していましたが、古いQtの例はもはや動かないので、それを使ってたくさんの問題に取り組んでいました。

self.gl = self.context().versionFunctions() 
    self.gl.initializeOpenGLFunctions() 

代わりに、あなたは適切なメジャー/マイナーバージョンでカスタムQSurfaceFormatを作成し、それは、適切なOpenGLのバージョンで動作させるためにQContextののsetFormatを使用する必要があります。これらの2行を使用しての問題だ

答えて

3

いずれにしても、もっと簡単な方法をお勧めします。すべての私のpyqt OpenGLプロジェクトのために私はちょうど私のウィジェットに直接PyOpenGLを使用し、私は無料で最新のOpenGLバージョンを手に入れます。以下のhelloglの例でPyOpenglを直接使用する例を紹介します.GPUの情報を表示するルーチンをいくつか追加しましたので、使用しているOpenGLのバージョンがシステムのものと一致します(gpu caps viewerなどで確認してください)。

import sys 
import math 

from PyQt5.QtCore import pyqtSignal, QPoint, QSize, Qt 
from PyQt5.QtGui import QColor 
from PyQt5.QtWidgets import (QApplication, QHBoxLayout, QOpenGLWidget, QSlider, 
          QWidget) 

import OpenGL.GL as gl 


class Window(QWidget): 

    def __init__(self): 
     super(Window, self).__init__() 

     self.glWidget = GLWidget() 

     self.xSlider = self.createSlider() 
     self.ySlider = self.createSlider() 
     self.zSlider = self.createSlider() 

     self.xSlider.valueChanged.connect(self.glWidget.setXRotation) 
     self.glWidget.xRotationChanged.connect(self.xSlider.setValue) 
     self.ySlider.valueChanged.connect(self.glWidget.setYRotation) 
     self.glWidget.yRotationChanged.connect(self.ySlider.setValue) 
     self.zSlider.valueChanged.connect(self.glWidget.setZRotation) 
     self.glWidget.zRotationChanged.connect(self.zSlider.setValue) 

     mainLayout = QHBoxLayout() 
     mainLayout.addWidget(self.glWidget) 
     mainLayout.addWidget(self.xSlider) 
     mainLayout.addWidget(self.ySlider) 
     mainLayout.addWidget(self.zSlider) 
     self.setLayout(mainLayout) 

     self.xSlider.setValue(15 * 16) 
     self.ySlider.setValue(345 * 16) 
     self.zSlider.setValue(0 * 16) 

     self.setWindowTitle("Hello GL") 

    def createSlider(self): 
     slider = QSlider(Qt.Vertical) 

     slider.setRange(0, 360 * 16) 
     slider.setSingleStep(16) 
     slider.setPageStep(15 * 16) 
     slider.setTickInterval(15 * 16) 
     slider.setTickPosition(QSlider.TicksRight) 

     return slider 


class GLWidget(QOpenGLWidget): 
    xRotationChanged = pyqtSignal(int) 
    yRotationChanged = pyqtSignal(int) 
    zRotationChanged = pyqtSignal(int) 

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

     self.object = 0 
     self.xRot = 0 
     self.yRot = 0 
     self.zRot = 0 

     self.lastPos = QPoint() 

     self.trolltechGreen = QColor.fromCmykF(0.40, 0.0, 1.0, 0.0) 
     self.trolltechPurple = QColor.fromCmykF(0.39, 0.39, 0.0, 0.0) 

    def getOpenglInfo(self): 
     info = """ 
      Vendor: {0} 
      Renderer: {1} 
      OpenGL Version: {2} 
      Shader Version: {3} 
     """.format(
      gl.glGetString(gl.GL_VENDOR), 
      gl.glGetString(gl.GL_RENDERER), 
      gl.glGetString(gl.GL_VERSION), 
      gl.glGetString(gl.GL_SHADING_LANGUAGE_VERSION) 
     ) 

     return info 

    def minimumSizeHint(self): 
     return QSize(50, 50) 

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

    def setXRotation(self, angle): 
     angle = self.normalizeAngle(angle) 
     if angle != self.xRot: 
      self.xRot = angle 
      self.xRotationChanged.emit(angle) 
      self.update() 

    def setYRotation(self, angle): 
     angle = self.normalizeAngle(angle) 
     if angle != self.yRot: 
      self.yRot = angle 
      self.yRotationChanged.emit(angle) 
      self.update() 

    def setZRotation(self, angle): 
     angle = self.normalizeAngle(angle) 
     if angle != self.zRot: 
      self.zRot = angle 
      self.zRotationChanged.emit(angle) 
      self.update() 

    def initializeGL(self): 
     print(self.getOpenglInfo()) 

     self.setClearColor(self.trolltechPurple.darker()) 
     self.object = self.makeObject() 
     gl.glShadeModel(gl.GL_FLAT) 
     gl.glEnable(gl.GL_DEPTH_TEST) 
     gl.glEnable(gl.GL_CULL_FACE) 

    def paintGL(self): 
     gl.glClear(
      gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) 
     gl.glLoadIdentity() 
     gl.glTranslated(0.0, 0.0, -10.0) 
     gl.glRotated(self.xRot/16.0, 1.0, 0.0, 0.0) 
     gl.glRotated(self.yRot/16.0, 0.0, 1.0, 0.0) 
     gl.glRotated(self.zRot/16.0, 0.0, 0.0, 1.0) 
     gl.glCallList(self.object) 

    def resizeGL(self, width, height): 
     side = min(width, height) 
     if side < 0: 
      return 

     gl.glViewport((width - side) // 2, (height - side) // 2, side, 
          side) 

     gl.glMatrixMode(gl.GL_PROJECTION) 
     gl.glLoadIdentity() 
     gl.glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0) 
     gl.glMatrixMode(gl.GL_MODELVIEW) 

    def mousePressEvent(self, event): 
     self.lastPos = event.pos() 

    def mouseMoveEvent(self, event): 
     dx = event.x() - self.lastPos.x() 
     dy = event.y() - self.lastPos.y() 

     if event.buttons() & Qt.LeftButton: 
      self.setXRotation(self.xRot + 8 * dy) 
      self.setYRotation(self.yRot + 8 * dx) 
     elif event.buttons() & Qt.RightButton: 
      self.setXRotation(self.xRot + 8 * dy) 
      self.setZRotation(self.zRot + 8 * dx) 

     self.lastPos = event.pos() 

    def makeObject(self): 
     genList = gl.glGenLists(1) 
     gl.glNewList(genList, gl.GL_COMPILE) 

     gl.glBegin(gl.GL_QUADS) 

     x1 = +0.06 
     y1 = -0.14 
     x2 = +0.14 
     y2 = -0.06 
     x3 = +0.08 
     y3 = +0.00 
     x4 = +0.30 
     y4 = +0.22 

     self.quad(x1, y1, x2, y2, y2, x2, y1, x1) 
     self.quad(x3, y3, x4, y4, y4, x4, y3, x3) 

     self.extrude(x1, y1, x2, y2) 
     self.extrude(x2, y2, y2, x2) 
     self.extrude(y2, x2, y1, x1) 
     self.extrude(y1, x1, x1, y1) 
     self.extrude(x3, y3, x4, y4) 
     self.extrude(x4, y4, y4, x4) 
     self.extrude(y4, x4, y3, x3) 

     NumSectors = 200 

     for i in range(NumSectors): 
      angle1 = (i * 2 * math.pi)/NumSectors 
      x5 = 0.30 * math.sin(angle1) 
      y5 = 0.30 * math.cos(angle1) 
      x6 = 0.20 * math.sin(angle1) 
      y6 = 0.20 * math.cos(angle1) 

      angle2 = ((i + 1) * 2 * math.pi)/NumSectors 
      x7 = 0.20 * math.sin(angle2) 
      y7 = 0.20 * math.cos(angle2) 
      x8 = 0.30 * math.sin(angle2) 
      y8 = 0.30 * math.cos(angle2) 

      self.quad(x5, y5, x6, y6, x7, y7, x8, y8) 

      self.extrude(x6, y6, x7, y7) 
      self.extrude(x8, y8, x5, y5) 

     gl.glEnd() 
     gl.glEndList() 

     return genList 

    def quad(self, x1, y1, x2, y2, x3, y3, x4, y4): 
     self.setColor(self.trolltechGreen) 

     gl.glVertex3d(x1, y1, -0.05) 
     gl.glVertex3d(x2, y2, -0.05) 
     gl.glVertex3d(x3, y3, -0.05) 
     gl.glVertex3d(x4, y4, -0.05) 

     gl.glVertex3d(x4, y4, +0.05) 
     gl.glVertex3d(x3, y3, +0.05) 
     gl.glVertex3d(x2, y2, +0.05) 
     gl.glVertex3d(x1, y1, +0.05) 

    def extrude(self, x1, y1, x2, y2): 
     self.setColor(self.trolltechGreen.darker(250 + int(100 * x1))) 

     gl.glVertex3d(x1, y1, +0.05) 
     gl.glVertex3d(x2, y2, +0.05) 
     gl.glVertex3d(x2, y2, -0.05) 
     gl.glVertex3d(x1, y1, -0.05) 

    def normalizeAngle(self, angle): 
     while angle < 0: 
      angle += 360 * 16 
     while angle > 360 * 16: 
      angle -= 360 * 16 
     return angle 

    def setClearColor(self, c): 
     gl.glClearColor(c.redF(), c.greenF(), c.blueF(), c.alphaF()) 

    def setColor(self, c): 
     gl.glColor4f(c.redF(), c.greenF(), c.blueF(), c.alphaF()) 


if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 
+0

偉大な、私はgithubの活動の不足のためVispyから移動しています。 PyOpenGLについてもっと学ぶための良いリソースへのリンクはありますか?私は機械ツールパス(gコード)とメッシュ(stls)を視覚化しようとしており、何かをクルージングするのに苦労しています。 pyopenglで働くことは、より良く終わるように感じる。 – fuchstraumer

+0

@fuchstraumer答えがあなたを助けてくれたことをうれしく思っています.g-codeとstlsについて有効であるとマークすることを検討してください。別の投稿を開いて、かなり興味深い話題をさらに詳しく説明できるようにしてください。 – BPL

+0

@fuchstraumer PyOpenglについて、私はこの[ウェブサイト](http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyopengl)のホイールをインストールして、[公式ドキュメント] (http://pyopengl.sourceforge.net/documentation)。 OpenGLまたはWebGLに精通している場合は、glコンテキストを作成すると、ミステリーはまったくありません。 – BPL

関連する問題