На данный момент у меня есть время только для быстрого ответа, но, возможно, это поможет.
Обработчики по умолчанию для списка не будут делать то, что вы хотите, они просто изменят внешний вид элемент, на который вы нажимаете. Но вы можете установить sh любую желаемую обработку нажатия кнопки с помощью функции bind
.
Функция tk bind
используется для указания того, что должно произойти при возникновении события в пользовательском интерфейсе. Что вы хотите сделать, так это указать что-то, что происходит при нажатии кнопки 1 (скажем) в списке. В моей системе не установлен labltk, поэтому я не могу опробовать этот код, но это будет примерно так:
bind ~events: [`ButtonPressDetail 1] ~action: myhandler listbox
Перед этим (конечно) вам нужно определить myhandler
, чтобы вставить желаемый текст.
Обновить
Этот код у меня работает. Обратите внимание, что вы хотите привязаться к событию отпускания кнопки (чтобы выбор уже произошел).
open Tk
let some_composers =
["Mozart"; "Chopin"; "Beethoven"; "Verdi"; "Bizet"]
let main () =
let top = openTk () in
Wm.title_set top "Listbox 2";
let v = Textvariable.create () in
Textvariable.set v "?";
let l =
Label.create
~textvariable: v
~background: (`Color "#FDF1B8")
~foreground: (`Color "#0F056B")
top
in
let mylist =
Listbox.create
~selectmode: `Single
~background: (`Color "#FF7F00")
~foreground: (`Color "#3F2204")
~selectbackground:(`Color "#BEF574")
~selectforeground:(`Color "#095228")
top
in
Listbox.insert ~index: `End ~texts: some_composers mylist;
let set_composer ev =
match Listbox.curselection mylist with
| [] -> () (* Not really possible *)
| index :: _ ->
Textvariable.set v (Listbox.get mylist index)
in
bind ~events: [`ButtonReleaseDetail 1]
~action: set_composer
mylist;
let bq = Button.create
~text: "Quit"
~command:
(fun () ->
print_endline "Bye.";
flush stdout;
closeTk ())
top
in
pack [l];
pack [mylist];
pack [bq];
Printexc.print mainLoop ()
let () = main ()
Когда я запускаю его таким образом, я вижу желаемое поведение:
$ labltk m.ml
Надеюсь, это поможет.