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)