すべてのウィンドウが閉じられるまでracket/gui
を使うラケットプログラムが実行されます。これにより、次のようなプログラムを簡単に書くことができます。`racket/gui`(` timer% `を停止するため)で作られたウィンドウをプログラムで閉じる
#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
メソッドを上書きして、タイマーを自分自身にとって悪い考え方にしていますか?