Графический интерфейс в Haskell с использованием gtk2hs иglade

Я создал графический интерфейс, используя gtk2hs иglade, а затем передал его коду haskell в файле main::IO(). Затем у меня есть некоторый код для окон, скажем, для ярлыков, кнопок и текста ввода . например.,

entry         <- xmlGetWidget xml castToEntry "entry1"
applyButton   <- xmlGetWidget xml castToButton "button1"

Затем после нажатия на кнопку применить

onClicked applyButton $ do
number <- get entry entryText

Передал значение переменной число

Затем я написал функцию для возведения числа в квадрат, как это

sqr :: Int -> Int -> IO ()
sqr number = number * number

после основного графического интерфейса.

Что не работает!!!!!!

Это должно работать как

I/p: получить номер от пользователя в графическом интерфейсе

o/p: Квадрат числа, отображаемого в графическом интерфейсе.


person Thenraja Vettivelraj    schedule 01.08.2012    source источник
comment
Извините, а где вопрос? Кроме того, sqr плохо типизирован; ты имеешь в виду sqr :: Int -> Int -> Int?   -  person Joachim Breitner    schedule 01.08.2012
comment
@JoachimBreitner извините, я не был ясен ранее. Надеюсь, теперь понятно... Да, я имею в виду то же самое...   -  person Thenraja Vettivelraj    schedule 01.08.2012
comment
Возможно, это руководство по вводу-выводу или одну из многих монады руководства будут хорошим следующим шагом.   -  person Daniel Wagner    schedule 01.08.2012
comment
Итак, кажется, вы хотели sqr number = print (number*number)? Это работает, но лучше отделить вычисления от операций ввода-вывода, sqr :: Int -> Int -> Int; sqr x = x*x и print (sqr number), когда вы хотите их распечатать.   -  person Daniel Fischer    schedule 01.08.2012


Ответы (1)


Ну, похоже, вы смешиваете части ввода-вывода и вычислительные части вместе.

У вас есть чистая функция для выполнения необходимых вам вычислений, например:

sqr :: Int -> Int -> Int
sqr number = number * number

И вам нужно отреагировать на событие, выполнив действие ввода-вывода, а именно, обновив состояние элемента gui. Я предполагаю, что вы пытаетесь вывести значение в ту же запись.

onClicked applyButton $ do
  num_str <- entryGetText entryText
  let number = read num_str
      squared = sqr number
  entrySetText entryText (show squared)

Пожалуйста, обратите внимание, entryGetText/SetText работают со строками, поэтому вам нужно конвертировать в и из Ints.

person Dmitry Vyal    schedule 01.08.2012
comment
Спасибо за руководство. У меня ошибка компиляции: не в области применения 'applyButton' я объявил кнопку применения, текст записи и другие элементы в IO. Затем в функции sqr я выполнил вычислительную часть, как вы упомянули. - person Thenraja Vettivelraj; 02.08.2012
comment
Трудно сказать причину, не видя кода (подсказка: используйте pastebin), но дважды проверьте написание идентификатора, имейте в виду, что Haskell чувствителен к регистру. Кроме того, убедитесь, что обработчик onClicked находится ниже начальной привязки applyButton. - person Dmitry Vyal; 03.08.2012
comment
Я проверил свой код и попытался использовать pastebin. Все еще не мог понять... Могу ли я вставить сюда свой код? - person Thenraja Vettivelraj; 08.08.2012