Я хочу иметь метку Tk, которую можно перемещать в окне путем перетаскивания.Вот как я пытался его получить:
- Поместите метку в
place
, используя абсолютную координату. - Привязайте события
ButtonPress
и ButtonRelease
и проследитекнопка мыши нажата.Также запишите координаты указателя мыши, когда пользователь начнет перетаскивать. - Привязать событие
Motion
и получить координату указателя.Вычислите разницу между двумя координатами и добавьте ее к координате метки, чтобы получить новую координату метки. - Установите новую координату метки, снова вызвав
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 ()
Кажется, это работает, но это правильный способ сделать то, что я хотел сделать?