LTK,按钮动作

时间:2011-10-30 14:58:36

标签: common-lisp ltk

我的第一个LTK应用程序。尝试使用entry-field中的参数执行函数。

(defpackage :test
  (:use :cl
    :ltk))

(in-package :test)

(defun main()
  (with-ltk ()
    (let* ((f (make-instance 'frame
                 :height 200
                 :width 300))
       (e (make-instance 'entry
                 :master f
                 ))
       (b (make-instance 'button
                 :master f
                 :text "Go"
                 :command (test (text e)))))
      (wm-title *tk* "Test")
      (pack f)
      (pack e :side :left)
      (pack b :side :left)
      (configure f :borderwidth 3)
      (configure f :relief :sunken))))

(defun test (str)
  (format t "String: ~a" str))

为什么函数只在源启动时执行一次?然后 - 任何行动。

1 个答案:

答案 0 :(得分:3)

如果您想传递回叫,请使用(lambda () ...),即代码:

...
(b (make-instance 'button
                  :master f
                  :text "Go"
                  :command (lambda () (test (text e))))))

否则,您的(test (text e))会在make-instance调用时执行,然后才能初始化对象。

如果打开调试输出,则更容易发现此问题:(setf ltk:*debug-tk* t)