user-interface - 以编程方式关闭使用 `racket/gui` 创建的窗口(停止 `timer%` )

标签 user-interface window racket window-managers

使用 racket/gui 的 Racket 程序会一直运行到所有窗口都关闭为止。这使得编写如下程序变得容易:

#lang racket/gui
(define window (new frame% [label "Hello"] [width 100] [height 100]))
(send window show #t)

现在程序将继续运行直到窗口关闭。

但是,有时以编程方式关闭窗口是有意义的,例如,如果我想要一个将关闭窗口并在倒计时结束后结束的倒计时。

据我所知,“关闭”窗口的唯一方法是 show 方法:

(send window show #f)

但这只是停止显示窗口,并没有真正关闭窗口。通常,这已经足够了,程序会退出,就像这个例子一样:

#lang racket/gui
(define window (new frame% [label "hello"]))
(send window show #f)

但是,如果程序有一个计时器,它不会在计时器结束之前退出。您可以在窗口 on-close 中设置回调,但这仅在窗口实际关闭时调用,而不是在使用 show 隐藏时调用。比如这个程序不会卡住:

#lang racket/gui
(define window
  (new (class frame%
         (super-new [label "hello"])
         (define timer
           (new timer%
                [interval 1000]
                [notify-callback (λ x (displayln "ding"))]))
         (define/augment (on-close)
           (send timer stop)))))

(send window show #f)

那么,有没有办法确定窗口何时被隐藏(通过 show)函数或以编程方式关闭窗口?如果两者都不是,重写 show 方法来停止计时器是不是一个坏主意?

最佳答案

既然你是 frame% 类的子类,你可以覆盖 show方法1 在窗口关闭时停止计时器。 (如果这对您很重要,请记住在窗口重新打开时重新启动它。)

(define/override (show show?)
  (unless show?
    (send timer stop))
  (super show show?))

让你的整个类(class)看起来像这样:

#lang racket/gui
(define window
  (new (class frame%
         (super-new [label "hello"])
         (define timer
           (new timer%
                [interval 1000]
                [notify-callback (λ x (displayln "ding"))]))
         (define/augment (on-close)
           (send timer stop))
         (define/override (show show?)
           (unless show?
             (send timer stop))
           (super show show?)))))

(send window show #f)

现在您的程序将终止。

1有一个on-superwindow-show方法,但它似乎并不总是在调用 show 时运行。

关于user-interface - 以编程方式关闭使用 `racket/gui` 创建的窗口(停止 `timer%` ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43877936/

相关文章:

Java - setVisible(true) 对 GUI 没有影响

c++ - 你能推荐一个好的跨平台应用程序开发框架吗?

ios - 如何将 iOS 应用程序窗口的背景图像居中

JavaScript 模态框对于屏幕来说太大了

racket - 如何从 Windows 运行已编译的 Racket 程序

scheme - PLTScheme如何捕获错误?

JQuery UI 可排序占位符样式问题

user-interface - 从用户那里获取日期/时间输入的最佳方法是什么?

python - 如何真正将窗口置于所有窗口之上——Linux PyGTK

方案中结构体的参数