首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PyQt5 + VTK - wglMakeCurrent失败错误

PyQt5 + VTK - wglMakeCurrent失败错误
EN

Stack Overflow用户
提问于 2022-08-23 11:07:08
回答 1查看 96关注 0票数 1

最低工作实例:

代码语言:javascript
运行
复制
from sys import exit
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QLabel, QFrame
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
import vtkmodules.all as vtk
from vtkmodules.util import numpy_support
import numpy as np

vtk_out = vtk.vtkOutputWindow()
vtk_out.SetDisplayMode(0)

def generate_qtvtk_sphere(parent):
    frame = QFrame(parent)
    vtkWidget = QVTKRenderWindowInteractor(frame)

    ren = vtk.vtkRenderer()
    vtkWidget.GetRenderWindow().AddRenderer(ren)
    iren = vtkWidget.GetRenderWindow().GetInteractor()

    # Create source
    source = vtk.vtkSphereSource()
    source.SetCenter(0, 0, 0)
    source.SetRadius(5.0)

    # Create a mapper
    mapper = vtk.vtkPolyDataMapper()
    mapper.SetInputConnection(source.GetOutputPort())

    # Create an actor
    actor = vtk.vtkActor()
    actor.SetMapper(mapper)

    ren.AddActor(actor)

    ren.ResetCamera()

    iren.Initialize()
    iren.Start()

    return vtkWidget

def generate_qtvtk_imagedata(parent):
    frame = QFrame(parent)
    vtkWidget = QVTKRenderWindowInteractor(frame)

    random_array = np.random.random([10, 600, 800])
    vtk_image_data = vtk.vtkImageData()

    image_array = numpy_support.numpy_to_vtk(random_array.ravel(), deep=True, array_type=vtk.VTK_TYPE_UINT16)
    vtk_image_data.GetPointData().SetScalars(image_array)
    vtk_image_data.Modified()

    reslice = vtk.vtkImageReslice()
    reslice.SetInputData(vtk_image_data)    
    reslice.SetOutputDimensionality(2)
    
    ren = vtk.vtkRenderer()
    vtkWidget.GetRenderWindow().AddRenderer(ren)
    iren = vtkWidget.GetRenderWindow().GetInteractor()

    # Create an actor
    actor = vtk.vtkImageActor()
    actor.GetMapper().SetInputConnection(reslice.GetOutputPort())
    ren.SetBackground(50, 50, 50)

    ren.AddActor(actor)

    ren.ResetCamera()

    interactorStyle = vtk.vtkInteractorStyleImage()
    vtkWidget.SetInteractorStyle(interactorStyle)
    vtkWidget.GetRenderWindow().SetInteractor(vtkWidget)
    vtkWidget.GetRenderWindow().Render()


    iren.Initialize()
    iren.Start()

    return vtkWidget


app = QApplication([])
main_window = QMainWindow()

main_widget = QWidget()
main_layout = QHBoxLayout()
main_widget.setLayout(main_layout)

qtvtk_widget_sphere = generate_qtvtk_sphere(main_widget)
qtvtk_widget_image = generate_qtvtk_imagedata(main_widget)

main_layout.addWidget(qtvtk_widget_image)
main_layout.addWidget(qtvtk_widget_sphere)

main_window.setCentralWidget(main_widget)


main_window.show()
app.exec()

这段代码的输出应该是一个pyqt窗口,一边是球体,另一边是随机生成的黑方块。这个方块代表了我通常处理的数据集。

我的conda env中的相关软件包是:

  • vtk 9.1.0
  • pyqt5 5.15.7
  • python 3.7.13 (由于依赖于另一个包而无法升级)

我得到的全部错误如下:

原文如下:

在我的应用程序中,我有两个QVTKRenderWindowInteractor,在两个不同的QWidgets上,它们基本上是相互独立的--在交互器之外有一个函数可以在同一件事情上更新两个交互参与者的内容,但仅此而已。

每当应用程序同时显示两个交互参与者时,当应用程序关闭时,我都会得到以下错误:

代码语言:javascript
运行
复制
2022-08-23 13:51:07.522 (  10.079s) [                ]vtkWin32OpenGLRenderWin:267    ERR| vtkWin32OpenGLRenderWindow (00000194B174E4C0): wglMakeCurrent failed in MakeCurrent(), error: ࣐Ɣ

在调试器上,最终的错误部分如下所示

通常会出现很多这样的错误。

我的另一个应用程序(相同的想法、qt、相同的交互程序、相同的设置)在代码的开头有这些行。

代码语言:javascript
运行
复制
vtk_out = vtkOutputWindow()
vtk_out.SetDisplayMode(0)

这就消除了那个错误。

但是在我的另一个程序中,我需要使用一个QWorker/QThread来更新interactor,并且将错误输出到控制台上已经不起作用了(它用相同的错误创建了一个新窗口,然后冻结了一切)。

我只想知道这些错误到底是什么,以及如何消除它们。

另外,我正在使用的设置interactor的代码如下所示:

在小部件中:

代码语言:javascript
运行
复制
        self._frame = QGroupBox()
        self.interactor = ViewerPanelVTK(self._frame)

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

哪里

代码语言:javascript
运行
复制
class ViewerPanelVTK(QVTKRenderWindowInteractor):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.panel_actor = vtkImageActor()
        self.panel_renderer = vtkRenderer()
        self.window = self.GetRenderWindow()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-31 10:49:47

我最终在VTK话语论坛上找到了答案。

显然,小部件需要关闭,这样就不会显示此错误。

原始答案中的示例代码如下:

代码语言:javascript
运行
复制
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
import vtk

class vtkWin(QWidget):

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

        layout = QVBoxLayout()
        self.setLayout(layout)
        self.vtkWidget = QVTKRenderWindowInteractor()
        layout.addWidget(self.vtkWidget)
        render = vtk.vtkRenderer()
        self.vtkWidget.GetRenderWindow().AddRenderer(render)

        cone_a=vtk.vtkConeSource()
        coneMapper = vtk.vtkPolyDataMapper()
        coneMapper.SetInputConnection(cone_a.GetOutputPort())
        coneActor = vtk.vtkActor()
        coneActor.SetMapper(coneMapper)
        render.AddActor(coneActor)
        self.vtkWidget.GetRenderWindow().Render()

    def closeEvent(self, QCloseEvent):
        super().closeEvent(QCloseEvent)
        self.vtkWidget.Finalize()     ############################ important

class MainWindow(QWidget):

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

        layout = QHBoxLayout()
        self.setLayout(layout)

        self.w1 = vtkWin()
        self.w2 = vtkWin()
        layout.addWidget(self.w1)
        layout.addWidget(self.w2)

    def closeEvent(self, QCloseEvent):
        super().closeEvent(QCloseEvent)
        self.w1.close()
        self.w2.close()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exec_()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73457615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档