user-interface - 如何在 Racket 中没有框架的 [x] 按钮的情况下退出 GUI 应用程序

标签 user-interface racket

“退出”是使用按钮退出 Racket 中 gui 应用程序的正确方法还是其他最适合此目的的方法?

(define myfr 
    (new frame% [label "myframe"] [width 100] [height 100] ))
(new message% [label "my gui app"][parent myfr])
(define exitbutton 
    (new button% [parent myfr] [label "Exit"]
                 [callback   (lambda (b e)   (exit)  )]))
(send myfr show #t)

我发现 DrRacket 在使用退出按钮时给出“交互已禁用”警告消息,但在使用框架的 [x] 按钮关闭时会干净退出。

我在此页面上找到了“on-exit”方法,但没有找到实际的退出方法:https://docs.racket-lang.org/gui/frame_.html?q=frame%25https://docs.racket-lang.org/reference/Exiting.html 上也没有提到任何具体内容。

我相信以下语句只会隐藏框架而不会关闭应用程序:

(send myfr show #f)

最佳答案

exit 绝对是您想要结束应用程序的方式。然而,当你执行此操作时,DrRacket 中的 REPL 会停止的原因是因为你的程序不再运行,每当你调用 exit 时就会发生这种情况,即使你的程序中没有 gui。

您也正确地认为:

(send myfr show #f)

将隐藏窗口但不会实际退出应用程序。

因此,您可以做的一件事就是尝试测试您是否在 DrRacket 中运行。如果您是这样,只需关闭窗口,并在用户单击“kill”或启动新程序后让 DrRacket 退出应用程序,而不是退出程序。

这样做的问题是,通常无法检测您是否在沙箱中运行。您可以采取一些技巧来测试这一点,但它不是很强大:

Determin if a racket program is in a sandbox

另一种方法是创建您自己的沙箱,并在该沙箱中运行您的程序(这就是 DrRacket 实际运行您的代码的方式)。然后,当你的程序退出时,仍然会有一个可用的repl。尽管请注意,repl 将用于沙箱本身,而不是其所在的 repl。

这是 creating a sandbox. 的文档

关于user-interface - 如何在 Racket 中没有框架的 [x] 按钮的情况下退出 GUI 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38955027/

相关文章:

python - wxpython 添加行到 TextCtrl

java - 有没有一种简单的方法可以从显示的 JFreeChart 图表中删除 TimeSeries?

java - 在 Java 中获取鼠标的精确坐标

java - 在java中通过线程显示图像序列

java - 用于配置 Java 属性文件的 GUI 工具

macros - 方案:用于代码复制的宏或高阶函数?

syntax - # 在 Scheme 数字文字中的含义

scheme - Typed Racket 中的绘图功能

performance - 方案中Streams的效率

Typed Racket 中的 Racket 通用图形库