一个简单的OCaml图形程序在窗口显示之前关闭了。

3

我的系统是ArchLinux

我有一个简单的ocaml程序,应该创建一个窗口并使用绘图基元。

open Graphics

let _ =
  open_graph "";
  set_window_title "Graphics example";
  draw_rect 50 50 300 200;
  set_color red;
  fill_rect 50 50 300 200;
  set_color blue;
  draw_rect 100 100 200 100;
  fill_rect 100 100 200 100

我可以编译它:
ocamlc graphics.cma -o graphics_exple graphics_exple.ml 

并使用以下方式启动:

./graphics_exple

我在任务栏中看到一个新窗口获得焦点,然后消失而没有看到任何窗口。
2个回答

2
这里的问题在于您的程序执行一系列命令后就会退出。一旦退出,与之关联的窗口也会关闭。如果您希望窗口保持打开状态,则需要防止程序退出。
一种可能的解决方案是使用Unix的sleep函数,在程序结尾处添加Unix.sleep 5,以保持窗口打开5秒钟,然后使用以下命令编译程序:
ocamlc graphics.cma unix.cma -o graphics_exple graphics_exple.ml 

另一种选择是在最后一个 fill_rect 后插入调用 loop() 的代码来进入无限循环。其中,loop 的定义如下:

let rec loop () = loop ()

最后,你可以有一个处理程序等待用户的输入并对其进行操作。为了论证,假设你想在控制台中打印用户键入的所有字符,但不包括使程序退出的'q'。你只需要在脚本末尾插入interactive(),其中interactive被定义为:

let rec interactive () =
  let event = wait_next_event [Key_pressed] in
  if event.key == 'q' then exit 0
  else print_char event.key; print_newline (); interactive ()

1
所有桌面图形界面(如Tcl/Tk或GTK)都有一个事件循环,必须进入该循环以便系统有时间执行和显示。
你可以使用
Thread.delay 10.0

我会尽力帮助您翻译。以下是需要翻译的内容:

或类似物。

我建议使用ocamlfind进行编译,方法如下,其中graphtemp.ml为您的测试文件:

ocamlfind ocamlc -o graphtemp -thread -package graphics -linkpkg graphtemp.ml

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接