当前位置: 首页 > 知识库问答 >
问题:

OpenGL:PyCharm在Mac上意外退出

濮宇定
2023-03-14

我正试图在Mac OS X上运行一个在windows上运行的项目。该项目使用OpenGL和PyQt库。使用OpenGL库时似乎出现了问题。

我下载了一个螺旋的OpenGL演示。

print("OpenGL: " + str(glGetString(GL_VERSION)))

返回OpenGL:b'2.1 NVIDIA-10.0.51 310.90.10.05b12'

当我尝试运行另一个项目时,PyCharm意外退出,我得到以下结果:

Traceback (most recent call last):
  File "/CS 410/Agile-Development-Project-master2/package/ui/widgets/gamewidget.py", line 177, in initializeGL
    glPrimitiveRestartIndex(self.restart)
  File "/anaconda/lib/python3.5/site-packages/OpenGL/platform/baseplatform.py", line 402, in __call__
    return self( *args, **named )
  File "errorchecker.pyx", line 53, in OpenGL_accelerate.errorchecker._ErrorChecker.glCheckError (src/errorchecker.c:1218)
OpenGL.error.GLError: GLError(
    err = 1282,
    description = b'invalid operation',
    baseOperation = glPrimitiveRestartIndex,
    cArguments = (4294967295,)
)

Mac信息图片

项目链接

主窗口。py公司

from PyQt5 import QtOpenGL
from PyQt5.QtWidgets    import QMainWindow, QStackedWidget
from package.ui.widgets import GameWidget

class MainWindow(QMainWindow):

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

        glformat = QtOpenGL.QGLFormat()
        glformat.setVersion(3, 1)
        glformat.setProfile(QtOpenGL.QGLFormat.CoreProfile)

        self.setWindowTitle('Game name here')
        #self.stacked_widget = QStackedWidget(GameWidget())
        self.setCentralWidget(GameWidget(glformat))

gamewidget中的初始化。py公司

def __init__(self, *args, n=10, **kwargs):

将版本设置为3.2:glGetString(GL_VERSION)返回3.3上下文

新错误(python仍然意外退出):

Traceback (most recent call last):
  File "/Users/daniel/WSCU/Spring 2017/CS 410/Agile-Development-Project-mastercurrent/package/ui/widgets/gamewidget.py", line 183, in initializeGL
    self.initializeCube()
  File "/Users/daniel/WSCU/Spring 2017/CS 410/Agile-Development-Project-mastercurrent/package/ui/widgets/gamewidget.py", line 142, in initializeCube
    program = self.loadShaders()
  File "/Users/daniel/WSCU/Spring 2017/CS 410/Agile-Development-Project-mastercurrent/package/ui/widgets/gamewidget.py", line 227, in loadShaders
    raise RuntimeError(glGetShaderInfoLog(fs))
RuntimeError: b"ERROR: 0:6: Use of undeclared identifier 'gl_FragColor'\n"

编辑:

def initializeTimer(self):
    self.pbar = QProgressBar(self)
    self.pbar.setGeometry(30, 40, 200, 25)
    self.timer = QBasicTimer()
    self.timer.start(1200, self)
    self.step = 100
    self.pbar.setValue(self.step)
    self.btn = QPushButton("Time is: " + str(int(self.step * 1.2)), self)
    self.btn.setStyleSheet("background-color: black; color: red;")
    self.btn.move(500, 10)
    self.show()


def timerEvent(self, e):
    if self.step <= 0:
        self.timer.stop()
        return
    self.step -= 1
    self.score += 1
    # print(self.score)
    self.btn.setText("Time is: " + str(int(self.step * 1.2)))
    self.scoreLabel.setText("Score: " + str(int(self.score)))
    self.pbar.setValue(self.step)
    self.pbar.setVisible(True)
    print(self.btn.text())
    print(self.pbar.text())


def makeScoreLabel(self):
    self.scoreLabel = QPushButton("Score: " + str(int(self.score)), self)
    self.scoreLabel.setStyleSheet("background-color: white; color: red;")
    self.scoreLabel.move(200, 10)

共有1个答案

舒枫涟
2023-03-14

您使用的是2.1上下文,glPrimitiveRestartIndex()是一个3.1(核心)函数。

要请求3.1上下文,请创建一个QGLFormat()并指定版本。

glformat = QtOpenGL.QGLFormat()
glformat.setVersion(3, 1)
glformat.setProfile(QtOpenGL.QGLFormat.CoreProfile)

然后在创建它时将其传递给您的QGLWidget(glformat)。

所以关于你的项目。由于GameWidget扩展了QGLWidget,这意味着您应该将glform传递给mainwindow.py中的GameWidget

self.setCentralWidget(GameWidget(glformat))

注意GameWidget中的__init__。因为n*args之前,这意味着b最终是格式,所以您需要像这样重新排列它:

def __init__(self, *args, n=10, **kwargs)

您现在的问题实际上是您的片段着色器。

0(5):错误C7533:全局变量gl_FragColor在版本120之后被弃用

您将版本设置为330,这意味着不推荐使用gl\u FragColor。相反,您必须指定自己的颜色输出。

#version 330

out vec4 outColor;

in vec3 fcolor;

void main()
{
   outColor = vec4(fcolor, 1.0);
}

您仍然需要将glformat传递给QGLWidget。

编辑:

如果你想添加一个标签,那么不要这样:

self.widget = GameWidget()
self.setCentralWidget(self.widget)

然后你需要这样做:

from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel

self.label = QLabel()
self.label.setText("Hello World")

self.layout = QVBoxLayout()
self.layout.addWidget(self.label)

self.widget = QWidget()
self.widget.setLayout(self.layout)

self.setCentralWidget(self.widget)

问题当然是现在我们有了一个新的QWidget,而不是GameWidgetQGLWidget)。这里的问题是您不能简单地将其他小部件添加到QGLWidget。这就是为什么在OpenGL方面,人们通常有自定义GUI或所有控件、标签等的单独窗口。

 类似资料:
  • 昨天,我刚刚在Mac OS Catalina 10.15.7版上安装了面向企业Java和Web开发人员的Eclipse IDE。我拖动日食。从下载文件夹到应用程序文件夹的应用程序。它工作得很好。我创建了几个servlet。但今天,当我点击应用程序打开它时,我收到了一个问题报告(错误),所以它没有打开。 错误详细信息为。。 启动后的唤醒时间:3300秒 系统完整性保护:启用 崩溃的线程:0 异常类型

  • 我如何使测试工作?

  • 我刚刚安装了MacOSX和Mavericks(10.9.2)。安装了JDK1.7.0_ 55。一切似乎都安装正确。我下载了EclipseKepler4.3.2并解压缩到我的应用程序文件夹。我再次检查了安装情况。启动应用程序时,我会收到以下错误消息: 我检查了我的控制台输出,并在Eclipse错误报告中得到以下内容: 异常类型:EXC _坏_访问(SIGSEGV)异常代码:KERN _ INVALI

  • 我正在尝试在python中使用selenium,由于某种原因我无法修改PATH,因此我只能指定浏览器驱动程序的位置。但是,我尝试了几个驱动程序,但都不起作用。 环境:Windows 7,Anaconda3-python3.6.1,selenium3.4.3,chrome59.0.3071.115(官方构建)(64位),chromedriver2.30(win32)。 这里是我尝试过的一部分代码和相

  • 测试启动后,结果是测试通过,但测试框架意外退出。如何解决? 试样 测试特性 输出 配置 http://maven.apache.org/xsd/maven-4.0.0.xsd"

  • 我在Android Studio中使用Tesseract来识别图片中的文本。当我像这样调用以下函数时: 会有一条红线表示“支持库不应该使用与CompilesDKVersion不同的版本”。然后我将compileSdkVersion和targetSdkVersion更改为22,我可以看到错误。 我可以在“compile'com.android.support:design:23.1.1'”下面看到一