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

User interface 以编程方式关闭使用“racket/gui”创建的窗口(停止“timer%”),user-interface,window,racket,window-managers,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方法

使用
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)
但是,如果程序有计时器,则在计时器完成之前不会退出。您可以在关闭时在窗口
中设置回调
,但这仅在窗口实际关闭时调用,而不是在使用
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%
类,所以只要关闭窗口,您就可以覆盖方法1来停止计时器。(如果对您很重要,请记住在窗口重新打开时重新启动。)

让你的整个班级看起来像:

#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这里有一个方法,但在调用
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)