Ввод пользовательского интерфейса с реактивной Banana-WX - PullRequest
6 голосов
/ 01 июля 2011

Как вы получаете содержимое элементов пользовательского интерфейса при использовании реактивного банана? Event0 возвращает событие типа Event (), которое имеет тип блока вместо типа элемента управления. event1 принимает событие типа Event w (a -> IO ()), но команда имеет тип Event w (IO ()). mapAccumE и mapAccumB принимают чистые функции в качестве параметров, поэтому get text foo не может использоваться с ними.

Ответы [ 2 ]

4 голосов
/ 04 июля 2011

(Автор реактивный-банан говорит. Извините за поздний ответ, возможность задаваемых здесь вопросов даже не приходила мне в голову.

Сегодня я обнаружил, что пропустил очень важную функцию из библиотеки: получение содержимого элемента пользовательского интерфейса в виде Behavior. Обидное! : -D

Джон описывает текущий обходной путь, но следующая версия реактивного банана будет включать отсутствующую функцию.

РЕДАКТИРОВАТЬ: Я выпустил реактивный банан версия 0.4 , которая теперь включает в себя функциональность в виде функции

fromPoll :: IO a -> NetworkDescription (Behavior a)
4 голосов
/ 01 июля 2011

По сути, вы хотите работать с функциями вместо данных.Если вы думаете: «Как мне создать поведение, в котором текущий текст находится в рамке», вы этого не сделаете.Вместо этого вы пишете функции, которые принимают текущий текст в качестве параметра и передают его при необходимости.Предположим, вы хотите распечатать содержимое текстового поля при нажатии кнопки.Затем вы должны сделать что-то вроде этого:

eButton :: NetworkDescription (Event ())
eButton = event0 button command

network = do
  pressButton <- eButton
  reactimate $ (\() -> get text foo >>= print) <$> pressButton

Если вам нужно получить ввод для поведения, вы можете аналогичным образом использовать функцию с типом Behavior (String -> a) (или любым другим нужным вам типом), а затем просто передатьстрока в точке вызова reactimate.

...