WxHaskell打破命令行arg功能

时间:2016-07-13 02:41:49

标签: haskell command-line-arguments wxwidgets wxhaskell

我在WXHaskell中编写了一个程序,并验证它是否有效。简而言之,我计划通过GUI或命令行界面使程序可用。后来我继续使用GetOpts库添加命令行参数处理,并开始测试各种参数是否按预期工作。

但是,一旦我开始使用命令行选项运行程序,程序就开始失败:只要在GUI模式下调用程序(即运行WXHaskell),程序就会发出崩溃,并显示有关无法识别的命令行选项的警告(此警告是以WXwidgets弹出窗口的形式)。无论何时程序在终端模式下运行,所有选项都被正确处理,所以我怀疑运行WX计算会导致“ARGV”值传递给某些WX函数,当然因为这些args用于主程序体,它们将无法识别。

我写了一个小的测试用例来重现这种行为(没有GetOpts)。

import Graphics.UI.WX
import System.Environment (getArgs)

gui = do
  fr <- frame [text := "GUI calculation"]
  t <- staticText fr [text := "Enter a number below"]
  n <- entry fr []
  let foo = do
        v <- read <$> get n text
        set t [text := "Your number * 3 is " ++ show (v * 3 :: Int) ]
  b <- button fr [text := "Calculate", on command := foo]
  set fr [layout := column 3 [widget t, widget n, widget b] ]

terminal = do
  putStrLn "Enter a number"
  v <- read <$> getLine
  putStrLn $ "Your number * 3 is " ++ (show $ v * 3)

main = do
  a <- getArgs
  case a of
    ("terminal"):_ -> terminal
    ("gui"):_ -> start gui
    _ -> start gui

处理命令行参数,并且计算(简单地将用户指定的Int乘以3)在终端上或通过gui运行。

如果用户指定“终端”,则程序完成没有问题。如果用户指定no args,则默认情况下计算在gui模式下运行,并且也正常完成。

如果用户指定“gui”参数,程序将崩溃并显示错误(在弹出窗口中):“意外参数'gui'”。

如果有人知道为什么我的args显然被传递给后续操作,或者更好,如何阻止这种情况发生,我会非常高兴!

1 个答案:

答案 0 :(得分:4)

我遇到过同样的问题。我的解决方法是使用withArgs启动GUI而不使用任何命令行参数:

main = do
  a <- getArgs
  case a of
    ("terminal"):_ -> terminal
    ("gui"):_ -> withArgs [] (start gui)
    _ -> withArgs [] (start gui)