Common-Lisp で Dijkstra アルゴリズムの GUI アプリケーションを開発するために ltk を使用しています。ただし、キャンバスにノードを配置するには、ノードのラベルが必要です。そのためには、ユーザーが文字列を入力して (そして Return キーを押して)、この値を使用してノードのインスタンスを開始するまで、実行を待機する必要があります。リッスン プロセスがないと、2 番目のトップレベル画面が作成された直後に戻ります。
以下は、ユーザーがメニューで [ノードの追加] オプションを選択したときに実行されるコードです。
(defun node-add-mode (canvas)
(configure canvas :cursor "cross")
(bind canvas "<ButtonPress-1>"
(lambda (evt)
(let* ((pos-x (event-x evt))
(pos-y (event-y evt))
(data (read-node-data))
(node (make-instance 'node :pos (list pos-x pos-y) :data data)))
(populate-graph :node node)
(create-graph canvas *graph*)))))
関数はpopulate-graph
作成したノードを実際のグラフに追加するだけで、create-graph
関数はそれをキャンバスに描画します。そして、これはread-node-data
私がこれまでに実装した機能です:
(defun read-node-data ()
(let* ((m (make-instance 'toplevel))
(f (make-instance 'frame :master m))
(l (make-instance 'label
:master f
:text "Insert The Object Value"))
(v (make-instance 'entry
:master f
:width *entry-width*)))
(wm-title m "Entry")
(pack f)
(pack l)
(pack v)
(bind v "<Return>"
(lambda (evt)
(let ((text (text v)))
(destroy m)
text)))))
イベントが発生した後にのみ、このコード ブロックからエントリ テキストを返し、"<Return>"
これをノードのインスタンス化に渡すことができるようにしたいと考えています。