Нуб Haskell Gi-GTK здесь. И GTK нуб в целом.
У меня есть изображение, которое я завернул в Eventbox. Теперь я хочу определить, когда пользователь нажимает на поле события (нажатие мыши). Некоторые гуглы указывают мне на использование button-press-event
. Мой код ниже.
drag <- imageNewFromFile "rszh.png"
dragevents <- eventBoxNew
containerAdd dragevents drag
set dragevents [widgetHalign := AlignEnd, widgetValign := AlignEnd]
onWidgetButtonPressEvent dragevents (print "Hello world")
И GHC не может скомпилировать это со следующим загадочным сообщением об ошибке:
panedraggin.hs:30:42: error:
• Couldn't match type ‘IO ()’
with ‘GI.Gdk.Structs.EventButton.EventButton -> IO Bool’
Expected type: GI.Gtk.Objects.Widget.WidgetButtonPressEventCallback
Actual type: IO ()
• Possible cause: ‘print’ is applied to too many arguments
In the second argument of ‘onWidgetButtonPressEvent’, namely
‘(print "Hello world")’
In a stmt of a 'do' block:
onWidgetButtonPressEvent dragevents (print "Hello world")
In the expression:
do { Gtk.init Nothing;
window <- windowNew WindowTypeToplevel;
onWidgetDestroy window mainQuit;
windowMaximize window;
.... }
Что я делаю неправильно?
print ...
в качестве обработчика событий, но предполагается, что это функция, принимающая информацию о том, какая кнопка была нажата и т.д. и возвращаетIO Bool
, где логическое значение указывает, удалось ли обработчику. - person chi   schedule 25.06.2017onButtonClicked button (putStrLn "Hello World")
для сигналов. Этот код работает без ошибок. В чем разница между моим кодом и их кодом? Я запустил:t
для обеих функций в ghci, и единственная разница в их сигнатурах типов заключается в том, что одна принимаетButtonClickedCallback
в качестве параметра, а другая принимаетWidgetButtonPressEventCallback
. Изменение моего оператора печати на функцию putStrLn по-прежнему дает мне ту же ошибку. - person hello   schedule 25.06.2017