Common Lisp 鼠标位置与 ltk

Common Lisp mouse position with ltk

我正在用 Common Lisp 制作一个简单的小程序,我想使用鼠标移动来控制它。 window 我使用 LTK。我找不到任何可以检索鼠标位置的函数。例如,Emacs Lisp 有 (mouse-pixel-position)。我找到 this on rosetta code,但没有 Common Lisp 条目。我能做什么?

来自这个 SO 答案的提示:Mouse Position Python Tkinter

并查看 ltk 的文档:http://www.peter-herth.de/ltk/ltkdoc/node16.html

我得到以下示例来检索鼠标移动触发的任何事件:

(ql:quickload "ltk")
(in-package :ltk-user)

(defun motion (event)
    (format t "~a~&" event))

(with-ltk ()
    (bind *tk* "<Motion>" #'motion))

这打开了一点 window,里面什么也没有。一旦你把鼠标放进去,你会得到很多事件:

#S(EVENT
   :X 0
   :Y 85
   :KEYCODE ??
   :CHAR ??
   :WIDTH ??
   :HEIGHT ??
   :ROOT-X 700
   :ROOT-Y 433
   :MOUSE-BUTTON ??)
…

#S 表示我们处理的是一个名为 EVENT 的结构,因此我们可以使用 (event-x event)event-mouse-button 等访问它的槽。参见 https://lispcookbook.github.io/cl-cookbook/data-structures.html#slot-access

您可能还想加入 freenode 上的 CL 社区,那里有一些游戏开发者。

在大多数情况下,基于事件的方法可能更合适,但您也可以直接查询当前位置:

(defpackage :so (:use :cl :ltk))
(in-package :so)

(with-ltk ()
  (loop
    (print 
      (multiple-value-list
        (screen-mouse)))
    (sleep 0.5)))

这将启动一个图形顶层并每 500 毫秒打印一次当前屏幕坐标,直到您退出顶层 window。 screen-mouse 函数接受可选的 w 参数(window)。