0

I am working with SBCL for Linux on an AMD64 machine. Function CONTROL-TEST makes a window with a drawing CANVAS and two sliding SCALEs. The slider :VARIABLES for UPPER-SLIDER and FORE-SLIDER are supposed to be bound to UPPER-THETA and FORE-THETA, respectively, but the update code never sees anything but 0. I have tested the update code in another function.

(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))))) 
2
  • Maybe, your problem is that you call update only once and don't call it on slider events? Commented Dec 16, 2012 at 7:58
  • @VsevolodDyomkin , from the docs and the source, I cannot see an update function belonging to this class. From what I can tell, this updates every redraw with all the other widgets.
    – SquareCrow
    Commented Dec 21, 2012 at 22:14

1 Answer 1

0

Please excuse me, it appears I did not perform my due diligence, this question was answered 3 years ago at the following location: http://permalink.gmane.org/gmane.lisp.ltk.user/329

The answer is that the name passed to :VARIABLE is not in fact updated automatically. Instead of messing with :VARIABLE, I pass a LAMBDA expression to the :COMMAND keyword; and therefore the following is the correct way:

(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))))

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.