覆盖球拍中的按钮回调

Overriding a buttons callback in Racket

我正在编写一个计算器应用程序,当单击它们时,编号按钮会将其值附加到文本字段。我正在尝试创建一个新按钮 class,其回调被覆盖,因此我不必为按钮的每个实例化添加相同的 lambda 函数,也不必为所有按钮添加最小宽度。在 canvas% 中,我可以通过覆盖 on-paint 来做到这一点,因为 on-paint 调用了 paint-callback,但我没有在按钮中找到类似的解决方案。

(define number-button% (class button%
                     (super-new)
                     (inherit get-label)
                     (init [min-width 30])
                     (define/override (callback)
                       (let ([value (send input-screen get-value)])
                         (send input-screen set-value (string-append value (get-label)))))))

还有一个我试图避免的例子

(define 7button (new button% [label "7"] [parent second-row]
                     [callback (λ (b e)
                                 (let ([value (send input-screen get-value)] [b-label (send b get-label)])
                                   (send input-screen set-value (string-append value b-label))))]))

有人有什么想法吗?如果有必要,我会写一个宏。

事后看来这是很明显的,但是通过传递我想要自动分配给超级 class 的初始化参数,也就是按钮,我可以创建一个已经有一个 class最小宽度,并定义了回调。

(define number-button% (class button%
         (super-new [callback (λ (b e)
                    (let ([value (send input-screen get-value)] [b-label (send b get-label)])
                      (send input-screen set-value (string-append value b-label))))]
                                [min-width 30])))

然后我可以像这样实例化按钮。

(define 7button (new number-button% [label "7"] [parent second-row]))
(define 8button (new number-button% [label "8"] [parent second-row]))
(define 9button (new number-button% [label "9"] [parent second-row]))

如果我愿意,我可以进一步修改新按钮% class 以自动成为第二行的父级,但这可能限制太多