我正在尝试使用TKinter中的VTK使用python制作动画,同时我被以下错误所卡住,并且我不理解此错误,请注意此错误
TypeError: 'NoneType' object is not callable
我不知道哪个对象为null或为空!为了识别这一点,我将print语句与函数参数一起放置,但是我找不到!请注意以下代码,请有人帮助我。我正在做的整个程序是在渲染屏幕中添加VTK球体对象,我想通过在计时器计数事件中移动该球体来进行动画处理。
错误命中线是
obj_renwin.actor.SetPosition(cone_Obj.timer_count, cone_Obj.timer_count,5);
请注意详细的代码
import vtk
class Cone():
def __init__ (cone_Obj):
cone_Obj.timer_count = 0
def sphere_render(cone_Obj,obj_renwin):
obj_renwin.sphereSource = vtk.vtkSphereSource()
obj_renwin.sphereSource.SetCenter(0.0, 0.0, 0.0)
obj_renwin.sphereSource.SetRadius(.5)
obj_renwin.actor = vtk.vtkActor()
obj_renwin.mapper = vtk.vtkPolyDataMapper()
obj_renwin.mapper.SetInputConnection(obj_renwin.sphereSource.GetOutputPort())
obj_renwin.actor.SetMapper(obj_renwin.mapper)
obj_renwin.actor.SetPosition(-0.5,.5,-0.5)
obj_renwin.prop = obj_renwin.actor.GetProperty()
obj_renwin.add_actors(obj_renwin.actor)
obj_renwin.renwin.Render()
return obj_renwin.actor
def animation(cone_Obj,obj_renwin):
renderwininstance=obj_renwin
#print renderwininstance
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(obj_renwin.renwin)
obj_renwin.renwin.Render()
renderWindowInteractor.Initialize()
renderWindowInteractor.AddObserver('TimerEvent',cone_Obj.execute(cone_Obj,obj_renwin))
timerId = renderWindowInteractor.CreateRepeatingTimer(5);
renderWindowInteractor.Start()
def execute(self,cone_Obj,obj_renwin):
print "obj_renwin is..."
print obj_renwin
obj_renwin.actor.SetPosition(cone_Obj.timer_count, cone_Obj.timer_count,5);
cone_Obj.timer_count += 1
obj_renwin.Render()
cone_Obj = Cone()
您使用AddObserver()添加观察者的方式不正确。AddObserver()接受一个自由函数(不是一个绑定函数),因此您需要定义一个全局函数并使用它。这里是重现该问题:
class Foo():
def execute(self, foo, bar):
print 'In execute'
foo = Foo()
o = vtk.vtkDataObject()
o.AddObserver('ModifiedEvent', foo.execute(foo, None))
o.Modified()
VTK实现观察者的方式使得很难将参数传递给他们。我通常使用闭包来解决这个问题。这是一个例子
class Foo():
def execute(self, foo, bar):
print 'In execute'
foo = Foo()
def MakeObserver(arg):
myarg = arg
def observer(obj, event):
myarg.execute(None, None)
return observer
o = vtk.vtkDataObject()
o.AddObserver('ModifiedEvent', MakeObserver(foo))
o.Modified()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句