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

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

3 голосов
/ 30 октября 2011

Мое первое 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 Ответ

3 голосов
/ 31 октября 2011

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

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

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

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

...