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
,如上所述