Lisp 麦克林,如何捕捉击键?
我现在正在学习麦克林。试图找出如何定义对击键做出反应的命令。对于名为Lisp 麦克林,如何捕捉击键?,lisp,common-lisp,mcclim,Lisp,Common Lisp,Mcclim,我现在正在学习麦克林。试图找出如何定义对击键做出反应的命令。对于名为superapp的应用程序,我有一个函数 (defun show (text) (lambda (gadget) (declare (ignore gadget)) (with-slots (text-field) *application-frame* (setf (gadget-value text-field) text)))) 在它的屏幕窗格上显示一些文本。它适用于激活回调中的窗格按钮。但是, (d
superapp
的应用程序,我有一个函数
(defun show (text)
(lambda (gadget)
(declare (ignore gadget))
(with-slots (text-field) *application-frame*
(setf (gadget-value text-field)
text))))
在它的屏幕窗格上显示一些文本。它适用于激活回调
中的窗格按钮。但是,
(define-superapp-command (com-greet :name t :keystroke (#\g :control)) ()
(show "Hey"))
不起作用。我知道我对它的定义是正确的,因为它与(框架退出*应用程序框架*)
配合得很好。所以我不明白其他的事情
编辑:这就是工作变量
(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"))
在上面的函数中,您尝试从插槽中获取小工具。这不是解决问题的办法。改用FIND-PANE-NAMED。给它一个框架和窗格的名称。它将返回该窗格
(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
中的代码看起来是错误的。不应在其中设置插槽文本字段。实际上,您根本不应该有槽文本字段。只需在回调中使用函数FIND-PANE-NAMED。在这里,您只需定义一个布局。如何格式化可读的代码?这可能会有帮助。这个lambda
的用途是什么?这里看起来不是这样的,我想我在复制时损坏了代码。Lambda,嗯,真的不确定,因为我只是从演示中复制代码块,试图找出问题所在。这是演示中的一件事。但是兰姆达应该做什么?我不知道。我怀疑这可能是连接到这个小玩意的某种方式?声明此函数不是通用函数。我看不出有什么奇怪的地方,因为在源代码中你可以找到一些功能,它们只是称自己为,没有别的,或者其他奇怪的东西。我知道它看起来好像什么都没做。如果你现在不知道LAMBDA的功能,那么把它去掉怎么样。它返回一个函数。如果该函数从未被调用,将不会发生任何事情。(setf(名为*application frame*'screen的查找窗格)text
setf说他无法设置该函数。@AndrewS:为什么要设置窗格?我以为你想设置窗格的小工具值?我的错。编辑了它。
(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)))))))