Текстовый редактор TraitsUI enter_set приводит к отклонению ввода

Я пытаюсь создать приложение traitsui. В рамках этого приложения я слушаю поплавок, который вводит пользователь. Редактор для этого поплавка по умолчанию — это TextEditor с включенным auto_set. Однако, когда пользователь заканчивает вводить это число, программа выполняет долгие вычисления, поэтому очень раздражает, когда программа слушает новый признак 1, когда пользователь действительно хотел ввести 1.7.

Я попытался решить эту проблему с помощью атрибута enter_set фабрики TextEditor. Но когда я это делаю, это вообще не позволяет обновлять черту, и поле отображается красным независимо от того, какое значение введено. Это явно не то, как должны работать enter_set и auto_set. Что я делаю не так?

Вот мой тестовый код:

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

class FloatEditorClass(HasTraits):
  f=Float
  click=Button('clickme')

  view=View(Item('f',editor=TextEditor(auto_set=False,enter_set=True)),
    # removing one or the other of these settings doesn't change anything
    Item(name='click'))

  def _click_fired(self):
    print self.f

fec=FloatEditorClass()
fec.configure_traits()

person aestrivex    schedule 08.03.2013    source источник


Ответы (2)


Вы можете использовать CFloat вместо Float, который пытается преобразовать значение, которое вы присваиваете признаку, в плавающее. Если вы попытаетесь присвоить строку Float, она обнаружит, что тип неправильный.

Например:

class CFloatDemo(HasTraits):
    f = Float
    cf = CFloat

demo = CFloatDemo()

demo.f = '3.0'  # This raises a TraitError
demo.cf = '3.0' # This assigns 3.0 to 'cf'

Обновление:

Другой вариант — сообщить TextEditor, как сопоставить строку со значением свойств:

traits_view=View(
   Item('f', editor=TextEditor(auto_set=False,enter_set=True, evaluate=float)),
   Item(name='click')
)

Вот как редактор по умолчанию для Float настраивается пользовательским интерфейсом Traits.

person pberkes    schedule 08.03.2013
comment
Другая альтернатива (но она уродлива): объявите трейт как f = Float(enter_set=True, auto_set=False) и используйте редактор по умолчанию в представлении (т.е. Item('f')). Он работает, но встраивает в модель информацию о пользовательском интерфейсе. - person Warren Weckesser; 11.03.2013

На самом деле, я понял, в чем была моя собственная проблема, и хотя я бы сказал, что это неизбежная ошибка в фабрике редакторов, у меня есть исправление.

Проблема в том, что когда вы вводите в текстовый редактор, скажем, строку «4», редактор интерпретирует вашу строку именно как строку «4», а не число. Если вы укажете трейт Int и позволите ему использовать свой редактор по умолчанию, он должен сделать что-то невидимое, чтобы преобразовать эту строку в int (вероятно, он просто указывает функцию int() как атрибут 'evaluate' редактора).

Вместо этого, если вы сами укажете редактор с исправлениями параметров, которые вас интересуют, это исправление будет пропущено (что является ошибкой в ​​TextEditor или, возможно, ошибкой самого Python, если вы утверждаете, что утиная печать по своей сути является ошибкой), поэтому вы должны предоставить исправление (например, параметр оценки) самостоятельно. В качестве эквивалентного решения, которое в общем случае немного проще, используйте фабрику DefaultOverride, созданную для этой цели.

person aestrivex    schedule 08.03.2013