2014-09-17 2 views
0

Я проектирования пользовательского интерфейса с TraitsUI Enthought, и я не могу понять, как сделать, чтобы получить то, что я хочу ...добавления/изменения «текст» к элементу в группе

Вот что я хочу : У меня есть элементы() в представлении, которое я хочу отображать как на английском, так и на единицах СИ. Я могу изменить значение в поле «edit» на основе кнопки SI/English, но я не могу понять, как изменить текст метки. Например, если у меня есть элемент «Длина, ft [3.28]» и преобразовать его в SI, я бы хотел, чтобы он показывал «Length, m [1.00]». Я могу обработать преобразование 3.28-> 1.00, но не могу понять, как изменить «ft» на «m».

Любые предложения?

Одна вещь, которую я пытался это определить строку, которая содержит имя единицы (например, «м» или «» футов) ... тогда, в пункте, я поставил метку, как это:

label = 'Top,' + lengthUnits

Это прекрасно работает, когда представление сначала построено, но оно не обновляет метку, когда я меняю элемент управления. Есть ли способ заставить представление обновить все новые значения?

Вот небольшая программа, которая показывает, что я пытаюсь сделать (не стесняйтесь критиковать мой стиль :)). Я также постараюсь добавить пару изображений, которая показывает, что происходит:

# NOTE: This version of the code has been modified so that it works as I want it to :) 
 

 
# Example trying to change text on a View... 
 

 
from traits.api \ 
 
    import HasTraits, Enum, CFloat, String 
 

 
from traitsui.api \ 
 
    import View, Group, HGroup, Item, spring 
 

 
class TestDialog (HasTraits): 
 
    length = CFloat(1.0) 
 
    choose_units = Enum('English', 'SI') 
 
    current_units = 'English' 
 
    unit_name = String('ft') 
 
    ft_to_m = CFloat(3.28) 
 
    
 
    view = View(
 
     Group(
 
      HGroup(
 
       spring, 
 
       Item(name = "length", label = 'Test length'), 
 
       Item(name = 'unit_name', style = 'readonly', show_label = False), 
 
       spring 
 
      ), 
 
      HGroup(
 
       spring, 
 
       Item(name = "choose_units"), 
 
       spring 
 
      ) 
 
     ), 
 
     title = 'Test Changing View Test' 
 
    ) 
 

 
    def _choose_units_changed(self): 
 
     if self.current_units != self.choose_units: 
 
      if self.choose_units == 'SI': 
 
       self.length /= self.ft_to_m 
 
       self.unit_name = 'm' 
 
      else: 
 
       self.length *= self.ft_to_m 
 
       self.unit_name = 'ft' 
 
     self.current_units = self.choose_units 
 
     
 
# Run the program (if invoked from the command line): 
 
if __name__ == '__main__': 
 
    # Create the dialog: 
 
    TestIt = TestDialog() 
 

 
    # put the actual dialog up... 
 
    TestIt.configure_traits()

Screen Shot showing my issue

ответ

1

Использовать уведомление, как описано здесь: http://code.enthought.com/projects/traits/docs/html/traits_user_manual/notification.html

Обновление в ответ на обновленный вопрос :

Справа, этикетки не обновляются динамически. Вместо этого создайте текстовое поле, которое выглядит как ярлык, например. с:

label_text = String('Test length, English:') 

Затем покажите его в Вид с чем-то вроде:

Item("label_text", style='readonly', show_label=False), 

Вы, вероятно, также хотите использовать HGroup вложен внутри (V) группы, чтобы расположить его влево вашего «длинного» дисплея.

Затем измените label_text внутри своего слушателя.

+0

Хммм, не уверен, что это поможет ... Я пользуюсь уведомлениями сейчас. Я собираюсь добавить в свой пост фрагмент кода и некоторые изображения, чтобы узнать, помогает ли это объяснить, что я пытаюсь сделать ... – Steve76063

+0

Обновлен ответ в ответ на фрагмент –

+0

Отлично! Это _exactly_, что я искал :) PS, моя «настоящая» программа использует HGroups, я просто не делал этот пример слишком вовлеченным. – Steve76063