1. On my Mac, I get the canvas, I see the circle, it sleeps for a second, the 
circle goes away --- precisely because paint-callback is called and it draws 
emptiness. 

2. If you don't see this, I think you're encountering a bug. This behavior 
should be the same across platforms. Report details. 

3. If you are a beginner, you may wish to study How to Design Programs 2e 
first: 

http://www.ccs.neu.edu/home/matthias/HtDP2e/Draft/index.html

4. Here is a stupid annotation with on-paint: 

#lang racket

(require slideshow racket/class racket/gui/base)

(define my-frame
  (new frame%
       [label "my frame"]
       [width 300] [height 300]
       [alignment '(center center)]))

(define x 40)
(define y 40)

(define my-canvas
  (new (class canvas%
         (super-new [parent my-frame])
         [define/override on-paint
           (lambda ()
             (displayln `(on-paint ,x ,y))
             (define my-dc (send my-canvas get-dc))
             (draw-pict (circle 60) my-dc x y)
             (set! x (+ x 3))
             (set! y (+ (random 3) y)))])))

(send my-frame show #t)

(for ((i (in-range 100)))
  (send my-canvas on-paint))

5. Next read up on timers. 




On Jun 25, 2015, at 7:26 AM, Mianlai ZHOU <mianlai.z...@nottingham.edu.cn> 
wrote:

> Hello Matthias,
> 
> Thank you very much for what you have answered for my question. I have 
> copy-pasted and run the program
> you gave below, but the outcome is a bit unexpected. Due to the fact that 
> there is a line
> 
> (draw-pict (circle 60) my-dc 40 40),
> 
> I thought it would draw a circle with radius 60 at point (40, 40), and then 
> wait for 1 minute. But actually, it
> draws nothing, on the canvas it is just blank, and then (after 1 min) it 
> turns to another background color.
> It is not expected.
> 
> What I really wanted to do is, to make animation, i.e., to draw some content 
> on canvas, and then (after a
> certain period of time or upon the event such as a mouse button click) 
> replace the content with other pictures
> on the same canvas. My question is now, how can I do it?
> 
> It seems to me obviously, without paint-callback I would be unable to do it. 
> Is it so? But with paint-callback I
> can only draw one picture, how can I update it? How to make animation?
> 
> Thank you for your help again and I hope you would be so kind to give me more 
> help on this question.
> 
> Thanks,
> 
> A Chinese beginner computer scientist, Mianlai
> 
> 
> ________________________________________
> From: Matthias Felleisen [matth...@ccs.neu.edu]
> Sent: 23 June 2015 6:07
> To: Mianlai Zhou
> Cc: Racket-Users List
> Subject: Re: [racket-users] drawing with canvas
> 
> [[ I am tempted to say that you misplaced the parentheses and brackets and 
> broke lines at the wrong place. ]]
> 
> Here is a re-ordering of the first "don't work" variant that kind of works:
> 
> #lang racket
> 
> (require slideshow racket/class racket/gui/base)
> 
> (define my-frame
>  (new frame%
>       [label "my frame"]
>       [width 300] [height 300]
>       [alignment '(center center)]))
> 
> (define my-canvas (new canvas% [parent my-frame]))
> (define my-dc (send my-canvas get-dc))
> (send my-frame show #t)
> (draw-pict (circle 60) my-dc 40 40)
> (sleep 1)
> 
> Stop! This should give you a hint of why you need to have an callback 
> function in this world.
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> In this world, many different events affect the visible canvas and it needs 
> to refresh itself all the time. Omitting the callback says "draw nothing" 
> when you refresh.
> 
> 
> 
> 
> On Jun 22, 2015, at 2:17 PM, Mianlai Zhou <mianlai.resea...@gmail.com> wrote:
> 
>> Hi people,
>> 
>> I am wondering why this segment of code failed to work:
>> 
>> ; don't work
>> #lang racket
>> 
>> (require slideshow racket/class racket/gui/base)
>> 
>> (define my-frame (new frame% [label "my frame"]
>>                             [width 300] [height 300]
>>                             [alignment '(center center)] ))
>> 
>> (define my-canvas
>>      (new canvas% [parent my-frame]
>>          ))
>> 
>> (define my-dc (send my-canvas get-dc))
>> 
>> (draw-pict (circle 60) my-dc 40 40)
>> 
>> (send my-frame show #t)
>> 
>> While the following codes *do* work:
>> 
>> ; do work
>> #lang racket
>> 
>> (require slideshow racket/class racket/gui/base)
>> 
>> (define my-frame (new frame% [label "my frame"]
>>                             [width 300] [height 300]
>>                             [alignment '(center center)] ))
>> 
>> (define my-canvas
>>      (new canvas% [parent my-frame]
>>                   [paint-callback (lambda (self dc)
>>                                  (draw-pict (circle 60) dc 40 40)
>>                               )]
>>          ))
>> 
>> (send my-frame show #t)
>> 
>> Is there anyway to avoid using redefining paint-callback to draw one or more
>> pictures on the canvas, as in the first example?
>> 
>> Thanks in advance for your answer,
>> 
>> Mianlai
>> 
>> 
>> --
>> You received this message because you are subscribed to the Google Groups 
>> "Racket Users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to racket-users+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
> 
> 
> This message and any attachment are intended solely for the addressee and may 
> contain confidential information.
> If you have received this message in error, please send it back to me, and 
> immediately delete it.
> 
> Please do not use, copy or disclose the information contained in this message 
> or in any attachment.
> 
> Any views or opinions expressed by the author of this email do not 
> necessarily reflect the views of The University of Nottingham Ningbo China.
> 
> 
> This message has been checked for viruses but the contents of an attachment 
> may still contain software viruses which could damage your computer system:
> you are advised to perform your own checks.
> 
> Email communications with The University of Nottingham Ningbo China may be 
> monitored as permitted by UK and Chinese legislation.

http://www.ccs.neu.edu/home/matthias/



-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to