Функция применяется к слишком многим аргументам в lablgtk
Мне нужна помощь в понимании того, почему следующий код не будет компилироваться. Я пытаюсь разместить GSourceView2 внутри вертикального поля в lablgtk. Я адаптировал код из этой статьи о Ocaml
open GMain
open GdkKeysyms
let locale = GtkMain.Main.init ()
let main () =
let window = GWindow.window ~width:320 ~height:240
~title:"Simple lablgtk program" () in
let vbox = GPack.vbox ~packing:window#add () in
window#connect#destroy ~callback:Main.quit;
(* Sourceview *)
let _ = new GSourceView2.source_view ~height:240 ~width:320 ~packing:vbox#add () in
window#show ();
Main.main ()
let () = main ()
Я получаю немного загадочную ошибку:
Error: This function has type
GtkSourceView2_types.source_view Gtk.obj -> GSourceView2.source_view
It is applied to too many arguments; maybe you forgot a `;'.
Однако вместо этого я могу создать GButton и установить его аргумент pack, чтобы поместить его в vbox. Подписи как для GButton.button, так и для GSourceView2.source_view выглядят очень похожими (за множеством необязательных аргументов следует единица), поэтому я не совсем уверен, что мне не хватает. Любая помощь в том, что я пропускаю, была бы очень полезна, поскольку я все еще довольно плохо знаком с этим языком.
2 ответа
Поскольку вы новичок в этом языке, я также дам вам краткий обзор того, как я решил эту проблему, чтобы вы могли почувствовать окружающую среду... к сожалению, иногда это может быть болезненным.
Таким образом, ошибка, которую вы получили, подразумевала отсутствие cma
или же cmxa
(Я не уверен, что вы использовали ocamlopt или ocamlc)
Давайте начнем с перехода к источнику... который доступен нам в любом из
~/.opam/archives/
или просто opam source lablgtk
, Заходим и видим файл META, это для ocamlfind
,
после cat META
мы видим эту важную часть полностью внизу.
package "sourceview2" (
exists_if = "lablgtksourceview2.cma,lablgtksourceview2.cmxa,lablgtksourceview2.cmxs"
description = "Bindings for gtksourceview2"
requires = "lablgtk2"
archive(byte) = "lablgtksourceview2.cma"
archive(native) = "lablgtksourceview2.cmxa"
)
Хорошо, это означает, что мы должны ожидать существования lablgtksourceview2.cma или.cmxa. Мы можем
cd `ocamlfind query lablgtk`
и тогда мы можем сделать либо locate lablgtksource2.cma
или же find . -name lablgtksourceview2.cma
, На моей платформе OS X также не существовало. После некоторой проверки на сайте lablgtk и общего поиска в Google это произошло потому, что на моей машине не было соответствующего кода gtk.
для людей OCaml на OS X вам нужно
1) opam uninstall lablgtk
(* Make sure that your path is set up correctly for PKG_CONFIG_PATH=/opt/X11/lib/pkgconfig *)
2) brew install gtksourceview libxml2
3) opam install lablgtk lablgtk-extras
Последний шаг может сорваться. Скорее всего, проблема с путём pkg-config, вот мой для PKG_CONFIG_PATH = /opt/X11/lib/pkgconfig/:/usr/local/Cellar/libxml2/2.9.2/lib/pkgconfig/
для людей OCaml на компьютерах, основанных на Debian, это должно включать Ubuntu, хотя я не уверен, что это правильное имя пакета для этого.
1) opam uninstall lablgtk
2) apt-get install liblablgtksourceview2-ocaml-dev
(* Not sure what the correct pkgconfig stuff is on linux but shouldn't matter I imagine *)
3) opam install lablgtk lablgtk-extras
Вы можете сделать проверку для .cma
потанцуйте после этого и уточните
pwd
/Users/Edgar/.opam/4.02.1/lib/lablgtk2
~/.o/4/l/lablgtk2 ❯❯❯ ls *.cma
lablglade.cma lablgtksourceview2.cma
lablgtk.cma lablrsvg.cma
Ура, соответствующий cma
существует. Мы также можем проверить с:
ocamlfind list | grep gtk
lablgtk2 (version: 2.18.0)
lablgtk2-extras (version: 1.5)
lablgtk2-extras.configwin (version: 1.5)
lablgtk2.auto-init (version: n/a)
lablgtk2.glade (version: n/a)
lablgtk2.rsvg (version: n/a)
lablgtk2.sourceview2 (version: n/a)
и есть соответствующий пакет, sourceview2.
Теперь ваш код полностью самодостаточен:
#require "lablgtk2.sourceview2"
open GMain
open GdkKeysyms
let locale = GtkMain.Main.init ()
let main () =
let window = GWindow.window ~width:320 ~height:240
~title:"Simple lablgtk program" () in
let vbox = GPack.vbox ~packing:window#add () in
window#connect#destroy ~callback:Main.quit;
(* Sourceview *)
let _ = GSourceView2.source_view ~height:240 ~width:320 ~packing:vbox#add () in
window#show ();
Main.main ()
let () = main ()
и я могу запустить его успешно с utop <the_file.ml>
Если вы предпочитаете использовать ocamlc или ocamlopt, удалите строку, начинающуюся с #require, поскольку это только для utop, а затем выполните:
(* I just named it stackru.ml, you can also use ocamlopt instead of ocamlc *)
ocamlfind ocamlc -package lablgtk2.sourceview2 -linkpkg stackru.ml -o SanityCheck
затем ./SanityCheck
который работал для меня на OS X.
Используя new
вы вызываете конструктор класса с одним аргументом GSourceView2.source_view
, а не функция многих аргументов GSourceView2.source_view
,
Хотя я не знаком с библиотекой Gtk, кажется, что функции с тем же именем, что и у классов, будут возвращать экземпляр этих классов, так что вы, вероятно, можете решить свою проблему, просто удалив new
,