Functional programming 在Racket的同一窗口中逐帧显示图像

Functional programming 在Racket的同一窗口中逐帧显示图像,functional-programming,racket,Functional Programming,Racket,我有三张同样大小的小照片。我想把它们一个接一个地展示出来 (define new1-bitmap (make-bitmap (send bird-bitmap get-width) (send bird-bitmap get-height))) (define dc-crop (new bitmap-dc% [bitmap new1-bitmap])) (define f-crop (new frame% [label "Random"])) (send f-cr

我有三张同样大小的小照片。我想把它们一个接一个地展示出来

(define new1-bitmap 
(make-bitmap 
 (send bird-bitmap get-width) 
 (send bird-bitmap get-height)))

 (define dc-crop 
  (new bitmap-dc% [bitmap new1-bitmap]))

 (define f-crop 
  (new frame% [label "Random"]))
 (send f-crop show #t)

 (send dc-crop draw-bitmap-section 
    bird-bitmap 
            0 
            0 
            0 
            (round(* (/ (send bird-bitmap get-height) 3) 2)) 
            (send bird-bitmap get-width)
            (round(/ (send bird-bitmap get-height) 3)))
 (void 
  (new message% [parent f-crop] [label new1-bitmap]))
 (sleep 3)
 (send dc-crop draw-bitmap-section 
    new1-bitmap 
            0 
            0 
            0 
            (round(/ (send bird-bitmap get-height) 3)) 
            (send bird-bitmap get-width)
            (round(/ (send bird-bitmap get-height) 3)))
  (void 
  (new message% [parent f-crop] [label new1-bitmap]))
  (sleep 3)
  (send dc-crop draw-bitmap-section 
    new1-bitmap 
            0 
            0 
            0 
            0
            (send bird-bitmap get-width)
            (round(/ (send bird-bitmap get-height) 3)))
(void 
 (new message% [parent f-crop] [label new1-bitmap]))
上面是我认为可以工作的代码。它只拍摄三张图像,并试图以3秒的间隔一张接一张地显示它们。此外,最终的GUI比其他GUI长三倍


我该怎么做呢?

可以使用2htdp库制作一个简单的动画窗口
2htdp/universe
是一个方便的地方,可以开始制作主要产生副作用的简单应用程序的原型

为了方便起见,示例代码使用了Racket附带的一些图标

#lang racket

(require 2htdp/image
         2htdp/universe)

(define image1 (bitmap icons/stop-16x16.png))
(define image2 (bitmap icons/bug09.png))
(define image3 (bitmap icons/break.png))

(define image-list (list image1 image2 image3))

(run-movie 3 image-list)
使用
racket/gui
的更复杂示例需要实现
timer%
而不是使用
sleep
,因为。看起来,当直接从源代码运行时,Racket希望将两次写入画布的操作排队,然后进入睡眠状态,然后清空队列并连续进行两次写入

第二个棘手的问题是访问画布绘图上下文的嵌套发送

下面的代码示例源自。它显示我当前的一只狗的图像,等待一秒钟,然后显示我以前的一只狗的图像

#lang racket/gui
(require 2htdp/image)
(provide (all-defined-out))


(define image1 (make-object bitmap% "scarlett.jpg"))
(define image2 (make-object bitmap% "witty2.jpg"))
(define my-frame (instantiate frame%("my frame")))

(define mcan%
  (class canvas%
    (override  on-paint)
    (define on-paint
      (lambda()(send (send this get-dc)
                     draw-bitmap image1 0 0)))        
    (super-instantiate())))

(define mcan (new mcan% (parent my-frame)
                  (min-width (image-width image1))
                  (min-height (image-height image1))))

(define timer 
    (new timer%
         (notify-callback
          (lambda()
            (send (send mcan get-dc)
                  draw-bitmap image2 0 0)))))

(send my-frame show #t)
(send timer start 1000)
第三种选择是使用
sleep\yield
,如上所述