Как только я выберу слово, как оно может быть мгновенно отображено на этикетке? - PullRequest
1 голос
/ 11 июля 2020
open Tk;;
let top = openTk ()
let _ = Wm.title_set top "Listbox 2"
let v = Textvariable.create ();;
Textvariable.set v " ? " ;;
let l = Label.create ~textvariable:v
    ~background:(`Color "#FDF1B8")
    ~foreground:(`Color "#0F056B")
    top
let mylist = Listbox.create
    ~selectmode:`Single 
    ~background:(`Color "#FF7F00")
    ~foreground:(`Color "#3F2204")
    ~selectbackground:(`Color "#BEF574")
    ~selectforeground:(`Color "#095228")
    top
let some_composers = ["Mozart";"Chopin";
              "Beethoven";"Verdi";"Bizet"]
let _ = Listbox.insert
    ~index:`End
    ~texts:some_composers
    mylist
let b = Button.create ~text:"Show selected composer"
    ~command:(fun () ->
      try
    let n = match (List.hd (Listbox.curselection mylist)) with
    | `Num y -> y
    | _ -> failwith "No Selection"
    in
    Textvariable.set v (List.nth some_composers n)
      with _ -> (print_endline "No Selection"; flush stdout)
         )
    top
let bq = Button.create ~text:"Quit"
    ~command:(fun () ->
         print_endline "Bye."; flush stdout; closeTk ())
    top;;
pack [l];;
pack [mylist];;
pack [b];;
pack [bq];;
let _ = Printexc.print mainLoop ()

введите описание изображения здесь

Приведенный выше код очень прост. Это позволяет выбрать конкретного музыканта в списке, нажать кнопку под списком, затем имя музыканта отображается в метке вверху окна.

Вместо использования кнопки я бы хотел бы удалить кнопку, и когда я выберу имя музыканта, оно будет мгновенно отображаться в метке над windows.

Есть ли правильный способ сделать это?

ПОПЫТКА

open Tk;;
let top = openTk ()
let _ = Wm.title_set top "Listbox 2"
let v = Textvariable.create ();;
Textvariable.set v " ? " ;;

let mylist = Listbox.create
    ~selectmode:`Single 
    ~background:(`Color "#FF7F00")
    ~foreground:(`Color "#3F2204")
    ~selectbackground:(`Color "#BEF574")
    ~selectforeground:(`Color "#095228")
    top
let some_composers = ["Mozart";"Chopin";
              "Beethoven";"Verdi";"Bizet"]
let _ = Listbox.insert
    ~index:`End
    ~texts:some_composers
    mylist

let n = List.hd (Listbox.curselection mylist) in
Textvariable.set v (List.nth some_composers n);
let l = Label.create 
    ~textvariable:(Textvariable.get mylist)
    ~background:(`Color "#FDF1B8")
    ~foreground:(`Color "#0F056B")
    top

let bq = Button.create ~text:"Quit"
    ~command:(fun () ->
         print_endline "Bye."; flush stdout; closeTk ())
    top;;
pack [l];;
pack [mylist];;
pack [bq];;
let _ = Printexc.print mainLoop ()

1 Ответ

1 голос
/ 11 июля 2020

На данный момент у меня есть время только для быстрого ответа, но, возможно, это поможет.

Обработчики по умолчанию для списка не будут делать то, что вы хотите, они просто изменят внешний вид элемент, на который вы нажимаете. Но вы можете установить 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

Надеюсь, это поможет.

...