Проблема с configure_traits при использовании Enthought Canopy

Я следовал руководству «Написание графических приложений для научного программирования с использованием 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, нажимая кнопку запуска, параметры по умолчанию печатаются немедленно; то всплывает окно. Когда вы затем настраиваете параметры в графическом интерфейсе и нажимаете «ОК», графический интерфейс закрывается, но новые значения параметров не печатаются.

Как будто каким-то образом camera.capture() запускается до camera.configure_traits.


person Geophys    schedule 25.11.2013    source источник


Ответы (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(), открывает графический интерфейс (configure_traits), а затем выполняет метод capture, который печатает текущие значения (по умолчанию "1" и "10").

Кнопки OK/Cancel не используются для установки этих значений. В качестве теста попробуйте изменить экспозицию или усиление, но вместо того, чтобы нажимать кнопки, попробуйте проверить эти атрибуты из командной строки Canopy IPython, когда графический интерфейс все еще открыт: camera.gain или camera.exposure должны возвращать новые установленные значения.

person jweaver    schedule 26.11.2013