PyVista按钮回调二次触发时仅渲染3D实体不显示2D图表问题
问题描述
- 运行基于pyvistaqt编写的交互程序时,首次点击触发按钮,
add_mesh、add_points添加的3D模型、点云数据,以及chart.scatter添加的2D散点图均可正常渲染 - 第二次及之后点击按钮,3D数据可以正常刷新显示,2D散点图表完全无法呈现
- 最小复现代码如下:
import sys import os os.environ["QT_API"] = "pyqt5" from qtpy import QtWidgets import numpy as np from pyvista import Chart2D import pyvista as pv from pyvistaqt import QtInteractor, MainWindow class MyMainWindow(MainWindow): def __init__(self, parent=None, show=True): QtWidgets.QMainWindow.__init__(self, parent) self.frame = QtWidgets.QFrame() vlayout = QtWidgets.QVBoxLayout() self.plotter = QtInteractor(self.frame) btn1 = QtWidgets.QPushButton("Button 1", self) vlayout.addWidget(btn1) btn1.clicked.connect(self.buttonClicked) vlayout.addWidget(self.plotter) self.frame.setLayout(vlayout) self.setCentralWidget(self.frame) self.show() def buttonClicked(self): self.plotter.clear() data = np.random.standard_normal(size=(100, 3)) actor = self.plotter.add_points(data) chart = Chart2D() _x = np.random.standard_normal(100) _y = np.random.standard_normal(100) chart.scatter(_x, _y, color="tab:blue", style="d", label="Scores") self.plotter.add_chart(chart) self.plotter.add_mesh(pv.Sphere()) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = MyMainWindow() sys.exit(app.exec_())
产生原因
QtInteractor继承自pyvista的Plotter类,其clear()方法默认不会清除已添加的2D图表对象,对应参数charts的默认值为False。
第一次点击按钮后添加的Chart2D实例会一直驻留在plotter的2D上下文渲染层,第二次点击调用clear()时旧的图表对象没有被移除,后续新建的Chart2D实例添加时会和残留的旧图表产生渲染层冲突,且默认图表位置完全重叠,最终导致新的2D图表无法被正常绘制。
修复方案
调用clear()方法时显式传入charts=True参数,在清除3D场景内容的同时同步清除已有的2D图表对象,修改后按钮点击回调的代码段如下:
def buttonClicked(self): # 显式指定清除时同步移除2D图表 self.plotter.clear(charts=True) data = np.random.standard_normal(size=(100, 3)) actor = self.plotter.add_points(data) chart = Chart2D() _x = np.random.standard_normal(100) _y = np.random.standard_normal(100) chart.scatter(_x, _y, color="tab:blue", style="d", label="Scores") self.plotter.add_chart(chart) self.plotter.add_mesh(pv.Sphere())
修改后多次点击按钮,3D数据和2D散点图均可正常刷新。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

