0

我正在关注教程“使用 TraitsUI http://code.enthought.com/projects/traits/docs/html/tutorials/traits_ui_scientific_app.html为科学编程编写图形应用程序 并测试了以下代码片段:

from enthought.traits.api import *
from enthought.traits.ui.api import *

class Camera(HasTraits):
    """ Camera object """

    gain = Enum(1, 2, 3,
        desc="the gain index of the camera",
        label="gain", )

    exposure = CInt(10,
        desc="the exposure time, in ms",
        label="Exposure", )

    def capture(self):
        """ Captures an image on the camera and returns it """
        print "capturing an image at %i ms exposure, gain: %i" % (
            self.exposure, self.gain )

if __name__ == "__main__":
    camera = Camera()
    camera.configure_traits()
    camera.capture()

如果我在命令行运行它,它会像宣传的那样工作。弹出一个图形用户界面。您调整参数,当您单击“确定”时,它会返回修改后的值。但是,当我通过单击运行按钮从 Canopy 编辑器中运行相同的代码时,会立即打印默认参数;然后弹出窗口。然后,当您在 GUI 中调整参数并单击“确定”时,GUI 会退出,但不会打印新的参数值。

就好像 camera.capture() 在 camera.configure_traits 之前运行一样。

4

1 回答 1

1

首先,我建议使用这个较新版本的教程:http ://docs.enthought.com/traitsui/tutorials/traits_ui_scientific_app.html

您链接到 TraitsUI 版本 3 的参考资料的那个,而上面的那个是您可能使用的版本(版本 4)。较新的教程使用较新的模块名称,traitsui.api而不是enthought.traits.ui.api例如。

至于为什么 Canopy 立即显示值,这是运行程序时的预期行为:

if __name__ == "__main__":
    camera = Camera()
    camera.configure_traits()
    camera.capture()

当运行为__main__(即不作为模块被另一个脚本导入)时,脚本按顺序执行以下三件事:创建 Camera() 的实例,弹出 GUI(configure_traits),然后执行capture打印当前的方法值(默认为“1”和“10”)。

OK/Cancel 按钮不用于设置这些值。作为测试,尝试更改曝光或增益,但不要单击按钮,而是尝试在 GUI 仍打开时从 Canopy 的 IPython 提示符中检查这些属性:camera.gain或者camera.exposure应该返回新设置的值。

于 2013-11-26T23:40:21.080 回答