Почему атрибут не обновляется в traitsui при вводе пользователем

У меня есть простая программа, которая получает ввод текста от пользователя и отображает его на инструменте (Кейтли). Однако атрибут, похоже, не меняется. То есть, когда я запускаю метод Start, вывод «Wowee», даже если я меняю Display во всплывающем окне. Должен ли я сделать его редактируемым? Я так не думал. В основном я следую Gael Varoquaux, посвященному чертам.

ControlPanel.py:

from traits.api import *
from traitsui.api import *

import Keithley3706A_module



class ControlPanel(HasTraits):
    keithley2430settings = Instance(Keithley2430.Keithley2430Settings, ())
    keithley3706Asettings = Instance(Keithley3706A_module.Keithley3706ASettings, ())
    start = Button("Start Measurements")
    clear_3706A_display = Button("Clear K3706A Display")

    k3706A_settings = Keithley3706A_module.Keithley3706ASettings()
    k3706A = Keithley3706A_module.Keithley3706A()
    view = View(Item('start', show_label=False,style='custom' ),
        Item('clear_3706A_display', show_label=False,style='custom' ),
        Item('keithley2430settings',style='custom'),
        Item('keithley3706Asettings',style='simple'))


    def _start_fired(self):
        print "hello %s" % self.k3706A_settings.display
        self.k3706A.message(self.k3706A_settings.display)

    def _clear_3706A_display_fired(self):
        self.k3706A.clear()

if __name__ == '__main__':
    ControlPanel().configure_traits()

Кейтли3706A.py:

from traits.api import *
from traitsui.api import *

import visa
import time

class Keithley3706ASettings(HasTraits):
    display = String("Wowee")

class Keithley3706A(HasTraits):
    def __init__(self):
       self.Keithley3706AUSB = visa.instrument("USB0::0x05E6::0x3706::04019447::INSTR") 

    def message(self,foo):
        s="display.settext('%s')" % foo
        self.Keithley3706AUSB.write("display.clear()")
        self.Keithley3706AUSB.write(s)

    def clear(self):
        self.Keithley3706AUSB.write("display.clear()")

person DanG    schedule 02.11.2013    source источник


Ответы (1)


В классе ControlPanel вы создали два разных экземпляра Keithley3706ASettings, а именно keithley3706Asettings и k3706A_settings. Если я удалю последний и заменю использование k3706A_settings на keithley3706Asettings, это сработает. Вот моя версия (с удаленными ссылками на устройство 2430, трейтом k3706A, объявленным как Instance из Keithley3706A, и несколькими другими не относящимися к делу изменениями пользовательского интерфейса):

class ControlPanel(HasTraits):

    keithley3706Asettings = Instance(Keithley3706A_module.Keithley3706ASettings, ())

    k3706A = Instance(Keithley3706A_module.Keithley3706A, ())

    start = Button("Start Measurements")
    clear_3706A_display = Button("Clear K3706A Display")

    view = View(UItem('start'),
                UItem('clear_3706A_display'),
                Item('keithley3706Asettings', style='simple'))

    def _start_fired(self):
        print "hello %s" % self.keithley3706Asettings.display
        self.k3706A.message(self.keithley3706Asettings.display)

    def _clear_3706A_display_fired(self):
        self.k3706A.clear()
person Warren Weckesser    schedule 04.11.2013
comment
Спасибо! Так почему же это не сработало? Помимо грязного, не может быть двух экземпляров? В чем разница между k3706A = Instance(Keithley3706A_module.Keithley3706A, ()) и k3706A = Keithley3706A_module.Keithley3706A()? Я не могу найти ссылку на Instance(). - person DanG; 04.11.2013
comment
Это не сработало, потому что GUI изменил один экземпляр, но _start_fired использовал строку из другого экземпляра, которая никогда не менялась. Он работает без объявления k3706A как Instance, и я не помню, могут ли возникнуть определенные проблемы, если не использовать Instance, но если вы собираетесь использовать Traits, вы также можете сделать объявление типа явным . Тип признака Instance упоминается в одной из таблиц предопределенных признаков здесь: docs.enthought.com/traits/traits_user_manual/ - person Warren Weckesser; 04.11.2013