我正在完成PyCon 2010 的演示文稿。大约在 2:30:45,演示者开始介绍trait 事件通知,它允许(除其他外)在 a发生变化时自动调用子例程。traits
trait
我正在运行他给出的示例的修改副本......在这个试验中,我试图看看我是否可以在对volume
或进行更改时触发静态事件inputs
。
from traits.api import HasTraits, Range, List, Float
import traits
class Amplifier(HasTraits):
"""
Define an Amplifier (a la Spinal Tap) with Enthought's traits. Use traits
to enforce values boundaries on the Amplifier's objects. Use events to
notify via the console when the volume trait is changed and when new volume
traits are added to inputs.
"""
volume = Range(value=5.0, trait=Float, low=0.0, high=11.0)
inputs = List(volume) # I want to fire a static trait event notification
# when another volume element is added
def __init__(self, volume=5.0):
super(Amplifier, self).__init__()
self.volume = volume
self.inputs.append(volume)
def _volume_changed(self, old, new):
# static event listener for self.volume
if not (new in self.inputs):
self.inputs.append(self.volume)
if new == 11.0:
print "This one goes to eleven... so far, we have seen", self.inputs
def _inputs_changed(self, old, new):
# static event listener for self.inputs
print "Check it out!!"
if __name__=='__main__':
spinal_tap = Amplifier()
spinal_tap.volume = 11.0
print "DIRECTLY adding a new volume input..."
spinal_tap.inputs.append(4.0)
try:
print "NEGATIVE Test... adding 12.0"
spinal_tap.inputs.append(12.0)
except traits.trait_errors.TraitError:
print "Test passed"
当我运行这个脚本时,我可以This one goes to eleven... so far, we have seen [5.0, 11.0]
在控制台输出中看到,所以我知道_volume_changed()
当我分配11.0
给spinal_tap.volume
.
但是,我从来没有看到任何来自_inputs_changed()
. 无论我编写什么示例,我都无法List
触发事件。
这是我看到的输出......请注意,没有证据表明_inputs_changed()
会发生火灾。
[mpenning@Bucksnort ~]$ python spinaltap.py
This one goes to eleven... so far, we have seen [5.0, 11.0]
DIRECTLY adding a new volume input...
NEGATIVE Test... adding 12.0
Test passed
[mpenning@Bucksnort ~]$
我已经在 Python2.6 / Cygwin / Windows 7 和 Python 2.5 / Linux 下运行了它(全部使用traits
我easy_install
直接关闭Enthought 网站的4.0.0 版本)。无论我到目前为止尝试了什么,结果都是一样的。
使用特征时应该List
能够触发静态事件吗?如果是这样,我做错了吗?