可以通过拖动移动的Tk标签

时间:2012-03-10 02:01:56

标签: ocaml tcl tk

我希望有一个可以通过拖动在窗口中移动的Tk标签。这是我试图得到它的方式:

  1. 使用绝对坐标place放置标签。
  2. 绑定事件ButtonPressButtonRelease,并监控是否按下了鼠标按钮。还记录用户开始拖动时鼠标指针的坐标。
  3. 绑定事件Motion并获取指针的坐标。计算两个坐标之间的差异,并将其添加到标签的坐标以获取标签的新坐标。
  4. 再次调用place设置标签的新坐标。
  5. 这是代码。它是用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 个答案:

答案 0 :(得分:3)

是的,使用放置和鼠标绑定是正确的方法。