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)