我想要禁用VTK警告窗口,或者更好的是,抓住它们来处理我的应用程序的日志记录系统。我的应用程序使用的是嵌入式mayavi视图,我不希望错误窗口弹出,我无法控制。以下代码演示了警告窗口。
import numpy as np
from mayavi import mlab
x1 = np.array([1, 1, 2, 3])
y1 = np.array([1, 1, 4, 2])
z1 = np.array([1, 1, 5, 1])
mlab.plot3d(x1, y1, z1)
mlab.show()
好的,我做了一些研究,发现vtk.vtkObject.GlobalWarningDisplayOff()
会完全禁用窗口,这很好。更好的是,以下代码会将警告记录到文件中(找到它here):
def redirect_vtk_messages ():
""" Can be used to redirect VTK related error messages to a
file."""
import tempfile
tempfile.template = 'vtk-err'
f = tempfile.mktemp('.log')
log = vtkpython.vtkFileOutputWindow()
log.SetFlush(1)
log.SetFileName(f)
log.SetInstance(log)
所以虽然这很好,但我仍然无法将警告直接传递给日志记录处理程序。我宁愿不必在常规日志文件旁边有一个vtk_log文件。此外,我可能想以某种方式处理我的GUI中的警告,或者让用户选择如何处理它们,并且不断观察日志文件的变化似乎是一种糟糕的方式。
关于在嵌入mayavi / vtk的应用程序中处理vtk警告的强大pythonic方法的任何建议?
答案 0 :(得分:4)
我想这部分回答了你的问题,但你可以在python中实现一个错误观察器,如http://public.kitware.com/pipermail/vtkusers/2012-June/074703.html所述,并将它添加到你感兴趣的vtk类中。
在c ++中,我发现将输出重定向到stderr要简单得多(这个例子适用于windows):
vtkSmartPointer<vtkWin32OutputWindow> myOutputWindow = vtkSmartPointer<vtkWin32OutputWindow>::New();
myOutputWindow->SetSendToStdErr(true);
vtkOutputWindow::SetInstance(myOutputWindow);
在python中我试过
ow = vtk.vtkOutputWindow()
ow.SendToStdErrOn()
它将错误发送到控制台,但我仍然看到vtk窗口,它似乎并没有抓住错误。
另一种选择可能是在关闭VTK_USE_DISPLAY(http://osdir.com/ml/python-enthought-devel/2009-11/msg00164.html)的情况下重新编译vtk。我不会尝试这个,因为我正在使用已在paraview
中编译的vtk发行版答案 1 :(得分:3)
我不知道这是否适用于Mayavi环境,但这适用于包装到VTK的Python包装
{{1}}
答案 2 :(得分:1)
您可以创建一个派生自vtkOutputWindow
的子类,并在方法void DisplayText(const char* someText)
中实现您的消息处理。我这样做是在redirect all output to cerr
的C ++项目中,甚至禁止特定的警告。
答案 3 :(得分:0)
我发现一种与@SciCompLover的答案类似的方法,该方法在显示到控制台的同时抑制输出窗口:
import vtk
vtk_out = vtk.vtkOutputWindow()
vtk_out.SetInstance(vtk_out)
在Windows和MacOS的Mayavi 4.7.1和VTK 8.2.0上进行了测试。