以编程方式关闭用`racket / gui`制作的窗口(停止`timer%`)

时间:2017-05-09 19:02:54

标签: user-interface window racket window-managers

使用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方法以自行停止计时器是一个坏主意?

1 个答案:

答案 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时似乎并不总是运行。