我在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显然被传递给后续操作,或者更好,如何阻止这种情况发生,我会非常高兴!
答案 0 :(得分:4)
我遇到过同样的问题。我的解决方法是使用withArgs
启动GUI而不使用任何命令行参数:
main = do
a <- getArgs
case a of
("terminal"):_ -> terminal
("gui"):_ -> withArgs [] (start gui)
_ -> withArgs [] (start gui)