使用racket/gui
的球拍程序会一直运行,直到所有窗口都关闭。这样可以轻松编写如下程序:
#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
方法以自行停止计时器是一个坏主意?
答案 0 :(得分:1)
由于您仍然是frame%
类的子类,因此只要窗口关闭,您就可以覆盖show
方法 1 来停止计时器。 (当窗口重新打开时,请记得重新启动它,如果这对您很重要的话。)
(define/override (show show?)
(unless show?
(send timer stop))
(super show 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))
(define/override (show show?)
(unless show?
(send timer stop))
(super show show?)))))
(send window show #f)
现在你的程序将终止。
1 有on-superwindow-show
方法,但在调用show
时似乎并不总是运行。