2011-10-30 13 views
3

私の最初のLTKアプリケーション。 entry-fieldからの引数で関数を実行しようとしています。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回だけ実行されるのですか?そして、 - 何らかの行動。

+0

'test'、' str'は未定義です。 – Svante

+0

@Svante - thx、そのちょうど間違いです。一定。しかし、エラーはまだ生きている – Lissomort

答えて

3

あなたは、コールバックを渡す(lambda() ...)を使用する、すなわち、あなたのコードにしたい場合:

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

オブジェクトが初期化される前に、それ以外の場合は、お使いの(test (text e))は、make-instance呼び出し時に実行されます。

デバッグ出力をオンにした場合には、この問題を発見する方が簡単です:あなたの関数で(setf ltk:*debug-tk* t)