Как проверить поле в зависимости от значения другого поля в Enaml? - PullRequest
0 голосов
/ 18 октября 2018

Допустим, у меня есть форма с 2 IntFields.Как я могу проверить IntField B в зависимости от ввода в IntField A?например, если A == 1, B может быть только в пределах 0-30;если A == 2, B может быть только в пределах 0-50;иначе B может быть любыми другими числами

Из всех, что я могу найти в Google, я могу найти только IntValidator, который проверяет поле только без возможности ссылки на другое поле.Нет примеров, которые я могу найти, чтобы показать, как я могу обновить минимальные / максимальные значения в IntValidator, или любой другой пользовательский Validator, который может принимать значение другого поля, так что проверка может изменяться в соответствии с изменением значения в другом поле ...

enamldef IntFieldsWindow( Window ):

    Container:
        Form:
            padding=0
            Label:
                text = 'Field A'
            IntField: fld_a:
                value = 0
            Label:
                text = 'Field B'
            IntField: fld_b:
                value = 0

После некоторых тестов на самом деле можно передать fld_a пользовательскому валидатору, затем получить значение fld_a.value в функции validate и, наконец, установить для пользовательского валидатора значение fld_b.Не уверен, что это способ сделать такую ​​проверку.

1 Ответ

0 голосов
/ 15 ноября 2018

Один из способов состоит в том, чтобы разбить данные на модель и сделать так, чтобы члены проверяли членов с помощью наблюдателя, который вызывается при изменении любого члена.

Затем выполните привязку IntField к значению модели (используя <<) и обновите значение модели с помощью обработчика уведомлений (::), который перехватывает и сообщает об ошибках проверки.

Например:

from atom.api import Atom, Int, observe
from enaml.stdlib.fields import IntField
from enaml.widgets.api import Window, Container, Label, Form


class Model(Atom):
    a = Int()
    b = Int()

    @observe('a', 'b')
    def _validate(self, change):
        # When a or b is changed validate the model state
        a, b = self.a, self.b
        if a == 1:
            if b < 0 or b > 30:
                raise ValueError("B is out of range")
        elif a == 2:
            if b < 0 or b > 50:
                raise ValueError("B is out of range")


enamldef Main(Window):
    attr model = Model()
    Container:
        Form:
            padding=0
            Label:
                text = 'Field A'
            IntField: fld_a:
                value << model.a
                value ::
                    error.text = ''
                    try:
                        model.a = change['value']
                    except ValueError as e:
                        error.text = str(e)
            Label:
                text = 'Field B'
            IntField: fld_b:
                value << model.b
                value ::
                    error.text = ''
                    try:
                        model.b = change['value']
                    except ValueError as e:
                        error.text = str(e)
        Label: 
            text << 'A:{} B:{}'.format(model.a, model.b)
        Label: error:
            pass

Обратите внимание, что метка, выводящая значения модели, никогда не имеет недопустимого состояния!Валидатор модели гарантирует, что этого никогда не произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...