Here is a solution in the DrRacket beginner language: (require 2htdp/universe) (require 2htdp/image)
(define (bundle x) (make-bundle x '() '())) (launch-many-worlds (universe 'n/a (on-new (λ (u nw) (bundle u))) (on-msg (λ (u w m) (bundle m))) (state #t)) (big-bang 'n/a (to-draw (λ (w) (empty-scene 200 200))) (register LOCALHOST) (on-mouse (λ (w x y ke) (make-package w x))))) Here is a solution in Racket derived from yours: #lang racket (require racket/gui/base) (define show-x (new frame% [label "frame for displaying the current x coordinate"] [width 200] [height 200] [enabled #t])) (define x-pos (new message% [parent show-x] [label "No x-pos yet."])) (define discover-x (new frame% [label "frame for noticing mouse evets and their current x coordinates"] [width 200] [height 200] [enabled #t])) (define y-pos (new (class canvas% (inherit get-dc) (super-new) (define/override (on-event mouse-event) (define x-pos (send mouse-event get-x)) (define y-pos (send mouse-event get-y)) (set! *x x-pos) (refresh))) [parent discover-x])) ;; for communicating between the two frams (define *x 'n/a) (define (refresh) (send x-pos set-label (format "~a" *x))) ;; run program run (send show-x show #t) (send discover-x show #t) ;; you were creating way too many event spaces. No need for that. On Apr 19, 2012, at 2:32 PM, Patrick Mahoney wrote: > #lang racket > #|Hello all, I'm PMah. |# > (require racket/gui/base) > > #|Problem: I have a message% control called x-pos parented by a frame% called > parent1. I have a canvas% called canvas parented under frame% parent2. I > would like x-pos to always show the current x coordinate of the mouse > position over canvas, and for this to be kept up to date as the mouse moves. > Ultimately I'd love to move to a reactive semantics. |# > > > #|Setting up the first frame and parent. I'm also going to grab the > eventspace for this frame while I'm at it.|# > (define parent1 (new frame% > [label "Parent1"] > [width 200] > [height 200] > [enabled #t])) > > (define x-pos (new message% > [parent parent1] > [label "No x-pos yet."])) > > (send parent1 show #t) > > (define eventspace1 (send parent1 get-eventspace)) > > > #|The second eventspace*frame*pos combo-|# > (define parent2 (new frame% > [label "Parent2"] > [width 200] > [height 200] > [enabled #t])) > > > #|Here comes the canvas subclass-I'm looking to override on-event method to > grab the x-component of the mouse pos, and I want to have that constantly > updating the x-pos message%. I really want reactive behavior, but I ran into > some issues with the frtime-namely, differences in bindings due to the > mzscheme bindings. the require spec (prefix-in ..) doesn't appear to be in > the language. I'm probably doing something wrong. |# > (define y-pos (class canvas% > > (inherit get-dc) > #|My notion of scope in objects is not precise. With those defines within the > scope of the on-event bindings, do the defines recalculate each time on-event > receives a message? lo, I wish I had some sort of channel protocol to pass > messages between threads, along with control. > The mushrooms kick in now. > PFFFT MIND > |# > (define/override (on-event mouse-event) > (define min-x (dc:min-x (get-dc))) > (define max-x (dc:max-x (get-dc))) > (define min-y (dc:min-y (get-dc))) > (define max-y (dc:max-y (get-dc))) > (define x-pos (send mouse-event get-x)) > (define y-pos (send mouse-event get-y)) > (call-in-other-eventspace (make-eventspace) (draw-diagnostics max-x > max-y x-pos y-pos))) > > (super-new))) > > (define > (send parent2 show #t) > > > #|I have tried some of the examples on > http://groups.google.com/group/plt-scheme/browse_thread/thread/28af25a01200bc3c/7937bb0314cc231e?lnk=raot > > Basically, one using a channel, probably incorrectly and the second without. > Now what I believe I've done is to add the thunk to the queue in the frame% > parent1's eventspace, but I haven't transferred control. The other > eventspace's thread still has control. Kind of? > |# > (define (call-in-other-eventspace e thunk) > (let ([ch (make-channel)]) > (parameterize ([current-eventspace e]) > (queue-callback (lambda () > (channel-put ch (thunk))))) > (channel-get ch))) > #|This blocks both frames updating in some way-im not able to transfer > control smoothly to the thread in the message% message1 workspace, and so the > x-pos label updates only sporadically when the other eventspace thread > yields? |# > (define (call-in-other-eventspace e thunk) > (parameterize ([current-eventspace e]) > (queue-callback thunk))) > > > #|How can I get x-pos to update automatically on each on-event send here? > (draw-diagnostics max-x max-y x-pos y-pos) appears to terminate here in all > cases. Part 2: how can I apply frtime to make the update relationship I want > between canvas mouse position and message text (or other racket reactive > work if it exists.). I really would like to understand this idiom and get it > in my toolchest for gui programming. Thanks all! Racket is an impressive > contribution to computer science. |# > > > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users