[ltk-user] two beginner questions (iterate over children / X_cursor)

Peter Herth herth at peter-herth.de
Fri Oct 26 15:35:23 UTC 2012


Hi,

sorry for the late reply, it somehow fell through my inbox. See for
the answers below,

Peter

On Sun, Sep 30, 2012 at 11:12 PM,  <harven at free.fr> wrote:
> Hi,
>
> I am working through the tk tutorial using ltk
> http://www.tkdocs.com/tutorial/firstexample.html
> One of the first examples is a feet-to-meter converter.
>
> At some point, the padding of the widgets is set by looping through
> the children of the mainframe.
>
>   foreach w [winfo children .c] {grid configure $w -padx 5 -pady 5}
>
> Q1: How can I do this with ltk ? Is there a function that returns the list
> of the children of a widget ?

No, there is no such function. But I don't think I ever needed it, as
I have the references to all widgets I created on the Lisp side
anyway. Just use (list label-1 label-2 ...) in your loop instead of
the call to children.

>
> Q2: The *cursor* variable lists "X_cursor" as its first element, but tk
> reports an error.
>
>   (with-ltk nil
>      (pack (make-instance 'button
>                        :text "some" :cursor "X_cursor" :width 15)))
>
>  => Tcl/Tk error: bad cursor spec "x_cursor"
>
> This is the sole cursor in *cursor* that produces an error.
> I am using gnu/linux on debian squeeze stable and tk 8.5.
>

Ah, probably the only cursor which starts with a capital lettter, I
need to fix this. Thanks for pointing that out.

>
> Finally, here is my attempt at building the converter. It seems to work, I welcome
> any comments or advices.
>
>
> (defun calculate (arg)
>   (let* ((*read-eval* nil)
>          (num (read-from-string arg)))
>     (if (numberp num) (format nil "~,4f" (* 0.3048 num)) "" )))
>
> (defun converter-ltk ()
>   (with-ltk ()
>     (let* ((mainframe (make-instance 'frame :padding "\"3 3 12 12\""))
>            (feet-entry (make-instance 'entry :width 7 :master mainframe))
>            (label-1 (make-instance 'label :master mainframe))
>            (label-2 (make-instance 'label  :text "feet" :master mainframe))
>            (label-3 (make-instance 'label  :text "is equivalent to"
>                                    :master mainframe))
>            (label-4 (make-instance 'label  :text "meters" :master mainframe))
>            (calc    (make-instance 'button :text "Calculate" :master mainframe
>                                    :command
>                                    (lambda ()
>                                      (setf (text label-1)
>                                            (calculate (text feet-entry)))))))
>       (bind feet-entry "<Return>" (lambda (evt)
>                                     (declare (ignore evt))
>                                     (setf (text label-1)
>                                           (calculate (text feet-entry)))))
>       (wm-title *tk* "Feet to Meters")
>       (grid mainframe 0 0 :sticky "nesw")
>       (grid-columnconfigure mainframe 0 :weight 1)
>       (grid-rowconfigure    mainframe 0 :weight 1)
>       (grid feet-entry 1 2 :sticky "we")
>       (grid label-1    2 2 :sticky "we")
>       (grid label-2    1 3 :sticky "w")
>       (grid label-3    2 1 :sticky "e")
>       (grid label-4    2 3 :sticky "w")
>       (grid calc       3 3 :sticky "w")
> ;      (loop for child in (children mainframe "winfo") ;; ??
> ;            do (configure child :padx 5 :pady 5))     ;; ??
>       (focus feet-entry))))
>
> _______________________________________________
> ltk-user site list
> ltk-user at common-lisp.net
> http://common-lisp.net/mailman/listinfo/ltk-user




More information about the ltk-user mailing list