Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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 3.x openGL和PyQt5的问题_Python 3.x_Opengl_Pyqt_Pyqt5_Pyopengl - Fatal编程技术网

Python 3.x openGL和PyQt5的问题

Python 3.x openGL和PyQt5的问题,python-3.x,opengl,pyqt,pyqt5,pyopengl,Python 3.x,Opengl,Pyqt,Pyqt5,Pyopengl,我正在从Winpython3.4.3.7Qt4迁移到Winpython3.x.x.xQt5(我尝试了很多版本),我遇到了以下问题: 下面是最简单的代码(它没有任何可用的功能,但演示了错误): 使用Winpython3.4.3.7Qt4在我的所有计算机上运行并打印“1”。当我使用Winpython3.x.x.xQt5时,它不再在我的虚拟机上运行。我得到的错误是: Traceback (most recent call last): File ".\opengl.py", line 12, in

我正在从Winpython3.4.3.7Qt4迁移到Winpython3.x.x.xQt5(我尝试了很多版本),我遇到了以下问题:

下面是最简单的代码(它没有任何可用的功能,但演示了错误):

使用Winpython3.4.3.7Qt4在我的所有计算机上运行并打印“1”。当我使用Winpython3.x.x.xQt5时,它不再在我的虚拟机上运行。我得到的错误是:

Traceback (most recent call last):
  File ".\opengl.py", line 12, in <module>
    index = gl.glGenLists(1)
  File "C:\Winpython-64bit-3.6.7.0\python-3.6.7\lib\site-packages\OpenGL\platform\baseplatform.py", line 405, in __call__
    return self( *args, **named )
  File "C:\Winpython-64bit-3.6.7.0\python-3.6.7\lib\site-packages\OpenGL\error.py", line 232, in glCheckError
    baseOperation = baseOperation,
OpenGL.error.GLError: GLError(
        err = 1282,
        description = b'invalid operation',
        baseOperation = glGenLists,
        cArguments = (1,),
        result = 0
)
回溯(最近一次呼叫最后一次):
文件“\opengl.py”,第12行,在
索引=gl.glGenLists(1)
文件“C:\Winpython-64bit-3.6.7.0\python-3.6.7\lib\site packages\OpenGL\platform\baseplatform.py”,第405行,在调用中__
返回self(*args,**已命名)
glCheckError中的文件“C:\Winpython-64bit-3.6.7.0\python-3.6.7\lib\site packages\OpenGL\error.py”,第232行
baseOperation=baseOperation,
OpenGL.error.GLError:GLError(
err=1282,
description=b“无效操作”,
baseOperation=glgenlist,
cArguments=(1,),
结果=0
)

我感觉window.makeCurrent()无法通过,但我不知道为什么。在这方面,从Qt4到Qt5发生了什么变化?

根据OpenGL文档
glGenLists
在以下情况下将返回
GL\u INVALID\u操作

如果在之间执行glgenlist,则生成GL\u无效的\u操作 glBegin的执行和glEnd的相应执行

因此,您似乎在OpenGL初始化之前调用
glgenlist
,或者在
glBegin
glEnd
绘图调用之间调用

我能够通过创建一个从
QGLWidget
继承的小部件来解决这个问题,并在调用
gl.glGenLists(1)
之前等待它被初始化,正如您在下面看到的,init方法内部发送了一个信号:

import sys
import OpenGL.GL as gl

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import pyqtSignal

from PyQt5.QtOpenGL import QGLWidget


class MyQGLWidget(QGLWidget):
    init = pyqtSignal()

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

    def glInit(self):
        super().glInit()
        self.init.emit()

    def gl_gen_lists(self, size):
        return gl.glGenLists(size)


class App(QApplication):
    def __init__(self, sys_argv):
        super().__init__(sys_argv)
        self.qgl_widget = MyQGLWidget()
        self.qgl_widget.init.connect(self.on_init)
        self.qgl_widget.show()

    def on_init(self):
        self.qgl_widget.makeCurrent()
        print(self.qgl_widget.gl_gen_lists(1))


if __name__ == '__main__':
    app = App(sys.argv)
    sys.exit(app.exec_())
错误消失了


参考资料:

我已经用Python 3.7和PyQt 5.11.2在Linux上进行了测试,我在Windows上没有遇到任何问题,很可能这只是一个问题。在四台Windows机器中,我有一台代码运行没有问题。请检查您获得的OpenGL上下文版本
glGenLists
在十年前已从OpenGL的现代版本中删除。我修改了答案,加入了对makeCurrent()的调用,就像在您的示例中一样,问题似乎已经解决,请告诉我您的情况;-)对不起,Isma,但我在代码的第22行遇到了相同的错误。你在使用虚拟机吗?事实上,是的,我在使用。实际上有好几个。很好的提示,因为现在我想起来了,代码只在一台真正的机器上工作,而在所有虚拟机器上都不工作。我刚刚在另一台真正的机器上运行了我的原始小示例代码,它运行得很好。因此,最新的OpenGL(或任何问题所在)中的变化似乎与虚拟机有关。这在某种程度上缓解了我的问题,但最终我也希望在虚拟机上使用该代码。(是的,我知道,最终我将不得不将代码转换为现代OpenGL。)您使用的是哪种虚拟机。这是关键,因为其中一些不支持OpenGL或仅支持功能的子集。它是基于KVM的Windows 10。但我认为它一定是新的Python/Qt/随便什么libs,而不是机器,因为我之前的Qt5/OpenGL软件运行在我所有的虚拟机上。
import sys
import OpenGL.GL as gl

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import pyqtSignal

from PyQt5.QtOpenGL import QGLWidget


class MyQGLWidget(QGLWidget):
    init = pyqtSignal()

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

    def glInit(self):
        super().glInit()
        self.init.emit()

    def gl_gen_lists(self, size):
        return gl.glGenLists(size)


class App(QApplication):
    def __init__(self, sys_argv):
        super().__init__(sys_argv)
        self.qgl_widget = MyQGLWidget()
        self.qgl_widget.init.connect(self.on_init)
        self.qgl_widget.show()

    def on_init(self):
        self.qgl_widget.makeCurrent()
        print(self.qgl_widget.gl_gen_lists(1))


if __name__ == '__main__':
    app = App(sys.argv)
    sys.exit(app.exec_())