我希望有一个可以通过拖动在窗口中移动的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 ()
这似乎有效,但这是否是我想做的正确方法?
答案 0 :(得分:3)
是的,使用放置和鼠标绑定是正确的方法。