我一直在尝试使用VTK制作动画,所以我一直在使用TimerEvent。当我尝试移至Qt绑定时,它坏了。问题在于,一旦我与视图进行交互(例如滚动以缩放或单击以旋转),计时器就会停止。这是一个简单的最小示例:
import vtk
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from PyQt5 import Qt
message = "tick"
def onTimerEvent(object, event):
global message
print(message)
if message == "tick":
message = "tock"
else:
message = "tick"
app = Qt.QApplication([])
mainWindow = Qt.QMainWindow()
renderer = vtk.vtkRenderer()
vtkWidget = QVTKRenderWindowInteractor(mainWindow)
vtkWidget.GetRenderWindow().AddRenderer(renderer)
mainWindow.setCentralWidget(vtkWidget)
vtkWidget.GetRenderWindow().GetInteractor().Initialize()
timerId = vtkWidget.CreateRepeatingTimer(100)
vtkWidget.AddObserver("TimerEvent", onTimerEvent)
mainWindow.show()
app.exec_()
此脚本应一遍又一遍显示“ tick”和“ tock”一词,但只要在窗口中单击即可停止。
一个奇怪的行为是,按“ T”键切换到轨迹球交互样式似乎有一定效果。如果我按T并在窗口内单击然后,则计时器仅在我单击时停止运行:放开时,计时器再次启动。如果再按J返回到“操纵杆模式”,则问题返回:单击将永远停止计时器。
Python 3.6,VTK 8,Qt 5。
答案 0 :(得分:1)
该问题在Linux 16.04,VTK8.1.1和Qt5.5.1。中均可重现。
在使用Qt时,解决问题的方法是使用QTimer()
。如果您要使用计时,这是一个解决方案。
这是您将TimerEvent
的{{1}}更改为最小的示例:
QTimer()