Lisp Toolkit (ltk): невозможно получить SCALE: значение переменной

Я работаю с SBCL для Linux на машине AMD64. Функция КОНТРОЛЬ-ТЕСТ формирует окно с рисунком ХОЛСТ и двумя скользящими ШКАЛАМИ. Ползунок :VARIABLES для 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))))) 

person SquareCrow    schedule 16.12.2012    source источник
comment
Может быть, ваша проблема в том, что вы вызываете обновление только один раз и не вызываете его для событий слайдера?   -  person Vsevolod Dyomkin    schedule 16.12.2012
comment
@VsevolodDyomkin, из документов и источника я не вижу функцию обновления, принадлежащую этому классу. Насколько я могу судить, это обновляет каждую перерисовку со всеми другими виджетами.   -  person SquareCrow    schedule 22.12.2012


Ответы (1)


Прошу прощения, похоже, я не проявил должную осмотрительность, ответ на этот вопрос был дан 3 года назад по следующему адресу: http://permalink.gmane.org/gmane.lisp.ltk.user/329

Ответ заключается в том, что имя, переданное в :VARIABLE, на самом деле не обновляется автоматически. Вместо того чтобы возиться с :VARIABLE, я передаю лямбда-выражение ключевому слову :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))))
person SquareCrow    schedule 21.12.2012