Программы Racket, использующие 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
, чтобы остановить таймер, плохой идеей?