【问题标题】:GUI in haskell using gtk2hs and glade使用 gtk2hs 和 glade 在 haskell 中的 GUI
【发布时间】:2012-08-01 08:30:44
【问题描述】:

我使用 gtk2hs 和 glade 创建了一个 GUI,然后将其传递给 main::IO() 中的 haskell 代码。然后我为 labelsbuttonsentry 文本编写了一些 windows 代码。例如,

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

然后点击应用按钮后

onClicked applyButton $ do
number <- get entry entryText

将值传递给变量number

然后我写了一个这样的数字平方函数

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

在 mainGUI 之后。

这行不通!!!!!!!

应该是这样的

I/p:在 GUI 中从用户那里获取一个数字

o/p: GUI中显示数字的平方

【问题讨论】:

  • 抱歉,问题出在哪里?此外, sqr 不是很好的类型。你的意思是sqr :: Int -&gt; Int -&gt; Int
  • @JoachimBreitner 抱歉,我之前不清楚。希望现在很清楚......是的,我的意思是一样的......
  • 也许 this IO tutorial 或众多 monad tutorials 之一将是一个很好的下一步。
  • 看来你想要sqr number = print (number*number)?这行得通,但最好将计算与 I/O 分开,sqr :: Int -&gt; Int -&gt; Int; sqr x = x*xprint (sqr number) 当你想打印它时。

标签: haskell glade gtk2hs


【解决方案1】:

嗯,看来您正在将 IO 和计算部分混合在一起。

你有一个纯函数来做你需要的计算,像这样:

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

并且您需要通过发出 IO 操作来对事件做出反应,即更新 gui 元素的状态。我假设您正在尝试将值输出到同一个条目中。

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

请注意,entryGetText/SetText 使用字符串,因此您需要与 Ints 相互转换。

【讨论】:

  • 感谢您的指导。我有一个编译错误:不在范围'applyButton' 我已经在IO 中声明了applybutton、entrytext 和其他元素。然后在 sqr 函数中,我已经完成了你提到的计算部分
  • 不看代码很难说出原因(提示:使用 pastebin),但请仔细检查标识符的拼写,记住,Haskell 区分大小写。此外,请确保 onClicked 处理程序位于初始 applyButton 绑定之下。
  • 我检查了我的代码并尝试使用 pastebin。还是想不通...我可以把我的代码贴在这里吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
相关资源
最近更新 更多