gpt4 book ai didi

common-lisp - 如何等到事件结束才能使用 ltk 从函数返回?

转载 作者:行者123 更新时间:2023-12-02 00:52:25 25 4
gpt4 key购买 nike

我正在使用 ltk 为 Common-Lisp 中的 Dijkstra 算法开发一个 GUI 应用程序。但是,要在 Canvas 上放置一个节点,我需要它的标签,为此,执行必须等到用户输入一个字符串(并按回车键)以使用该值启动节点实例。没有监听过程,返回发生在第二个顶层屏幕创建之后。

下面是当用户在菜单上选择“添加节点”选项时执行的代码:

(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函数将其绘制在 Canvas 上。这是 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>" 之后返回此代码块的条目文本事件发生,以便能够将其传递给节点实例化。

最佳答案

Tcl 有一个 vwait代码需要阻塞某些变量值的情况的机制。据我所知,这在 LTK 中是不可用的。您可以使用另一个系统,例如 cl-async,但也许最简单的选择是将您的代码从里到外翻转,使其成为基于事件的:仅在名称已知时构建节点。

(defun read-node-data (continuation)
...
(bind v
"<Return>"
(lambda (evt &aux (text (text evt)))
(destroy m)
(funcall continuation text))))

然后:

(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)))
(read-node-data
(lambda (data)
(let ((node (make-instance 'node
:pos (list pos-x pos-y)
:data data)))
(populate-graph :node node)
(create-graph canvas *graph*))))))))

关于common-lisp - 如何等到事件结束才能使用 ltk 从函数返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56621391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com