提问人:akbiggs 提问时间:8/21/2012 更新时间:1/14/2015 访问量:1179
如何在 Racket GUI 应用程序中更改多行文本的颜色?
How do I change the color of multiple lines of text in a Racket GUI app?
问:
我正在尝试使用 Racket 的 GUI 工具包,并试图在屏幕上使用 ASCII 艺术获得很酷的变色效果。我有一个可以更改颜色的回调,但我似乎不知道如何调用它以获得适当的结果。
起初,我尝试使用消息控件来绘制文本,然后从那里更改文本颜色,但据我所知,没有办法更改消息的文本颜色。所以我继续使用 canvas 子窗口,但我似乎无法一次绘制多行文本;换行符被删除,ASCII 艺术显示为一长行文本。此外,我用来更改颜色的 on-paint 回调似乎仅在调整窗口大小或以其他方式更改窗口时调用,因此如果用户坐着观看,颜色不会改变。
如果我能找到一种方法在画布上的每一帧上进行回调,我可以遍历文本字符串列表并将每个文本字符串绘制到屏幕上,垂直分隔以提供换行符的外观,但我不知道画布是否存在这样的“帧上”调用。
关于如何让它工作的任何想法?
答:
7赞
Asumu Takikawa
8/21/2012
#1
这里最容易使用的小部件可能是 text% 类(您还需要一个 editor-canvas% 来使用它)。查看更改样式和相关方法,了解如何更改特定文本段的样式。
例:
#lang racket/gui
(define frame (new frame% [label "Test"] [width 300]
[height 300]))
(define text (new text%))
(define canvas (new editor-canvas% [parent frame]
[editor text]))
(define style-delta (make-object style-delta%
'change-normal-color))
;; do some red
(send style-delta set-delta-foreground "red")
(send text change-style style-delta)
(send text insert "Hello world in red\n")
;; do some blue
(send style-delta set-delta-foreground "blue")
(send text change-style style-delta)
(send text insert "Now available in blue")
(send frame show #t)
评论
0赞
akbiggs
8/21/2012
漂亮,奏效了!我使用我创建的计时器每隔几个刻度调用一次颜色变化回调,并用它来更改 ASCII 艺术的样式增量。非常感谢!
0赞
KIM Taegyoon
1/14/2015
#2
您不必指定 change-command。
更简单的一个:
#lang racket/gui
(define frame (new frame% [label "Test"] [width 300]
[height 300]))
(define text (new text%))
(define canvas (new editor-canvas% [parent frame]
[editor text]))
(define style-delta (make-object style-delta%))
;; do some red
(send style-delta set-delta-foreground "red")
(send text change-style style-delta)
(send text insert "Hello world in red\n")
;; do some blue
(send style-delta set-delta-foreground "blue")
(send text change-style style-delta)
(send text insert "Now available in blue\n")
;; do some modern
(send style-delta set-delta-foreground "black")
(send style-delta set-family 'modern)
(send text change-style style-delta)
(send text insert "Now available in modern\n(fixed width)")
(send frame show #t)
评论