使用 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/