2017-05-09 10 views
1

すべてのウィンドウが閉じられるまで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メソッドを上書きして、タイマーを自分自身にとって悪い考え方にしていますか?

答えて

0

とにかくframe%クラスをサブクラス化するので、showメソッドをオーバーライドして、ウィンドウが閉じられるたびにタイマーを停止することができます。 (それはあなたにとって重要である場合、ウィンドウが開き直すと、それを再起動することを忘れないでください。)

(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) 

は今、あなたのプログラムは終了します。

ありon-superwindow-show方法があるが、showが呼び出されたときに常に実行していないようです。

関連する問題