我正在使用gtk2hs库构建一个小的Haskell GUI应用程序作为练习,但我已经陷入了某种困境。所以我想展示一个FileChooserDialog,用户可以在其中选择多个图像,我创建了一个完成所有这些操作的函数,但现在我想不出将这些值返回到main函数的方法,以便这些可以与所选的一起使用文件。这是我创建主窗口的主要功能:
main :: IO ()
main = do
initGUI
window <- windowNew
set window [windowDefaultWidth := 300, windowDefaultHeight := 150, containerBorderWidth := 10]
table <- tableNew 3 4 True
containerAdd window table
startButton <- buttonNewWithLabel "Start"
tableAttachDefaults table startButton 0 4 2 3
selectButton <- buttonNewWithLabel "Select images"
tableAttachDefaults table selectButton 0 2 0 1
selectedLabel <- labelNew (Just "0 images selected")
tableAttachDefaults table selectedLabel 2 4 0 1
onClicked selectButton (selectImages selectedLabel window)
shiftLabel <- labelNew (Just "Days to shift: ")
-- Left align text in label
miscSetAlignment shiftLabel 0.0 0.5
tableAttachDefaults table shiftLabel 0 3 1 2
adjustment <- adjustmentNew 0.0 (-5000.0) 5000.0 1.0 10.0 0.0
spinner <- spinButtonNew adjustment 0.5 0
tableAttachDefaults table spinner 3 4 1 2
widgetShowAll window
mainGUI
显示FileChooserDialog的函数是selectImages函数,是selectButton的onClick函数。这个函数的工作原理如下:
selectImages :: LabelClass self => self -> Window -> IO ()
selectImages resultLabel parent = do
chooser <- fileChooserDialogNew (Just "Select images") (Just parent) FileChooserActionOpen [("Cancel", ResponseCancel), ("Open", ResponseAccept)]
fileChooserSetSelectMultiple chooser True
widgetShow chooser
response <- dialogRun chooser
case response of
ResponseCancel -> putStrLn "Cancelled"
ResponseAccept -> do
files <- fileChooserGetFilenames chooser
labelSetText resultLabel $ (show (length files)) ++ " images selected"
widgetDestroy chooser
现在我想做的是能够将selectImages函数中的files数组返回到main函数以进行进一步处理。我怎样才能做到这一点?我应该以某种方式使用StateT变压器吗?或其他什么?