Lisp Toolkit (ltk): невозможно получить SCALE: значение переменной
Я работаю с SBCL для Linux на машине AMD64. Функция CONTROL-TEST делает окно с рисунком CANVAS и двумя раздвижными шкалами. Ползунок: переменные для UPPER-SLIDER и FORE-SLIDER должны быть привязаны к UPPER-THETA и FORE-THETA соответственно, но код обновления никогда не видит ничего, кроме 0. Я тестировал код обновления в другой функции.
(defun controltest ()
"Test of a user-controlled robot arm"
(with-ltk ()
; (make-instance 'scale :master fscale :from 0 :to 100 :length 150 )
(let* ((upper-theta 0) (fore-theta 0)
(upper-slider
(make-instance 'scale :from 0 :to 7
:length 360 :variable upper-theta))
(fore-slider
(make-instance 'scale :from 0 :to 7
:length 360 :variable fore-theta))
(cnvs (make-instance 'canvas :width cnvs-width :height cnvs-height))
(upper (manip:uctk-beam :cen-x 200 :cen-y 200
:b-length 40 :b-width 20
:tk-cnvs cnvs))
(fore (manip:uctk-beam :cen-x 0 :cen-y 40 ; relative to upper
:b-length 40 :b-width 20
:tk-cnvs cnvs))
(slp-time 50))
(labels ((update ()
(draw upper nil) ; contains FORE, no need to draw separately
(geo:set-member-theta upper 2 fore-theta)
(geo:set-theta upper upper-theta)
(after slp-time #'update)))
(geo:add-geo upper fore) ; make FORE a member of UPPER
(pack cnvs :fill :both :expand 1)
(pack upper-slider :side :bottom)
(pack fore-slider :side :bottom)
(update)))))
1 ответ
Прошу прощения, похоже, я не выполнял комплексную проверку, на этот вопрос был дан ответ 3 года назад по следующему адресу: http://permalink.gmane.org/gmane.lisp.ltk.user/329
Ответ заключается в том, что имя, передаваемое:VARIABLE, фактически не обновляется автоматически. Вместо того, чтобы связываться с:VARIABLE, я передаю выражение LAMBDA ключевому слову:COMMAND; и, следовательно, следующий путь является правильным:
(upper-slider
(make-instance 'scale :from 0 :to 7
:length 360
:command (lambda (val) (setq upper-theta val))))
(fore-slider
(make-instance 'scale :from 0 :to 7
:length 360
:command (lambda (val) (setq fore-theta val))))