1

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

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

我编写了一个小测试用例来重现这种行为(没有 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 运行。

如果用户指定“终端”,程序完成没有问题。如果用户不指定任何参数,则计算默认以 gui 模式运行,并且也正常完成。

如果用户指定“gui”参数,程序崩溃并出现错误(在弹出窗口中):“Unexpected parameter 'gui'”。

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

4

1 回答 1

4

我也遇到过同样的问题。我的解决方法是withArgs在没有任何命令行参数的情况下启动 GUI,如下所示:

main = do
  a <- getArgs
  case a of
    ("terminal"):_ -> terminal
    ("gui"):_ -> withArgs [] (start gui)
    _ -> withArgs [] (start gui)
于 2016-07-13T10:43:20.550 回答