Метка Tk, которую можно переместить, перетаскивая - PullRequest
1 голос
/ 10 марта 2012

Я хочу иметь метку Tk, которую можно перемещать в окне путем перетаскивания.Вот как я пытался его получить:

  1. Поместите метку в place, используя абсолютную координату.
  2. Привязайте события ButtonPress и ButtonRelease и проследитекнопка мыши нажата.Также запишите координаты указателя мыши, когда пользователь начнет перетаскивать.
  3. Привязать событие Motion и получить координату указателя.Вычислите разницу между двумя координатами и добавьте ее к координате метки, чтобы получить новую координату метки.
  4. Установите новую координату метки, снова вызвав place.

Вот код.Это написано на OCaml, но я думаю, что ясно, что я здесь делаю.

let () =
  let t = openTk () in
  let l = Label.create ~text:"move me" t in
  place ~x:100 ~y:100 l;
  let d = ref false
  and xprev = ref 0 and yprev = ref 0 in
  bind ~events:[`ButtonPress] ~fields:[`MouseX; `MouseY]
    ~action:(fun ev -> d := true; xprev := ev.ev_MouseX; yprev := ev.ev_MouseY)
    l;
  bind ~events:[`ButtonRelease] ~action:(fun _ -> d := false) l;
  bind ~events:[`Motion] ~fields:[`MouseX; `MouseY]
    ~action: (fun ev ->
     if !d then
       let x = Winfo.x l and y = Winfo.y l in
       place ~x:(x + ev.ev_MouseX - !xprev) ~y:(y + ev.ev_MouseY - !yprev) l)
    l;
  mainLoop ()

Кажется, это работает, но это правильный способ сделать то, что я хотел сделать?

1 Ответ

3 голосов
/ 10 марта 2012

Да, использование привязки места и мыши - правильный способ сделать это.

...