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」引数を指定すると、プログラムがクラッシュし、(ポップアップ ウィンドウで)「予期しないパラメータ '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 に答える