LTK, действие кнопки

Мое первое LTK-приложение. Попытка выполнить функцию с аргументом из поля ввода.

(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 ответ

Если вы хотите передать обратный вызов, используйте (lambda () ...)в вашем коде:

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

В противном случае ваш (test (text e)) выполняется во время make-instance вызов, прежде чем объект будет инициализирован.

Обнаружить эту проблему легче, если включить выход отладки: (setf ltk:*debug-tk* t)

Другие вопросы по тегам