McCLIM,如何捕捉按键?

时间:2018-11-05 19:56:14

标签: lisp common-lisp mcclim

我目前正在学习McCLIM。试图弄清楚如何定义一个命令,它将对按键做出反应。对于名为superapp的应用程序,我有一个功能

(defun show (text)
  (lambda (gadget)
    (declare (ignore gadget))
 (with-slots (text-field) *application-frame*
(setf (gadget-value text-field)
   text))))

在其屏幕窗格上显示一些文本。它适用于activate-callback中的窗格按钮。但是,

(define-superapp-command (com-greet :name t :keystroke (#\g :control)) ()
 (show "Hey"))

不起作用。我知道我对它的定义正确,因为它可以与(frame-exit *application-frame*)一起很好地工作。所以我只是不明白其他事情。

编辑:所以,这是有效的变体

(define-application-frame superapp ()
 ()
 (:panes
  (tf1
   :push-button
       :label "Left"
       :activate-callback (show "HI"))
  (app :application
   :display-time nil
   :height 400
   :width 600)
  (screen :text-field))
 (:layouts
  (default
   (with-slots (text-field) *application-frame*
               (vertically ()
                screen
                (tabling (:grid t)
                 (list tf1 app)))))))

(defun show (text)
 (lambda (gadget)
   (declare (ignore gadget))
  (setf (gadget-value (find-pane-named *application-frame* 'screen)) 
    text)))

(define-superapp-command (com-greet :name t :keystroke (#\g)) ()
 (setf (gadget-value (find-pane-named *application-frame* 'screen)) 
 "text"))

1 个答案:

答案 0 :(得分:2)

(defun show (text)
   (setf (gadget-value (slot-value *application-frame* 'text-field))
         text))

在上述功能中,您尝试从插槽获取小工具。这不是方法。请改用FIND-PANE-NAMED。给它一个框架和窗格的名称。它将返回该PANE。

(define-application-frame superapp ()
 ((text-field :initform nil))
 (:panes
  (tf1
   :push-button
       :label "Left"
       :activate-callback (show "HI"))

同样,您现在在完全不同的上下文中使用SHOW。现在,它应该返回一个LAMBDA,它将小工具作为参数。

  (app :application
   :display-time nil
   :height 400
   :width 600)
  (screen :text-field))
 (:layouts
  (default
   (with-slots (text-field) *application-frame*
               (vertically ()
                (setf text-field screen)
                (tabling (:grid t)
                 (list tf1 app)))))))

现在:layouts中的代码看起来错误。您不应该在其中设置广告位文本字段。实际上,您根本不应该拥有TEXT-FIELD插槽。只需在您的回叫中使用FIND-PANE-NAMED函数即可。在这里,您只需定义布局即可。