我有一個非常簡單的 Racket GUI:
(define frame (new frame% [label "Goodbye, World!"]))
(define msg (new message% [parent frame]
[label "No events so far..."]))
(new button% [parent frame]
[label "Click Me"]
(callback (lambda (button event)
(send msg set-label "Button click"))))
(send frame show #t)
這可以按預期作業 - 生成一個回應事件的按鈕 - 如果我直接運行它。但是,如果我將它作為另一個 Racket GUI 應用程式的一部分在沙箱中運行:
(define/public (set-content content)
(parameterize ([sandbox-gui-available #t])
(let ((evaluator (make-evaluator 'racket/gui)))
(evaluator content))))
...content上面的 Racket 源在哪里,然后框架在set-content被呼叫時顯示:

...但不回應點擊等事件。
我懷疑我在這里遺漏了一些明顯的東西,但是檔案建議新的 GUI 應該有自己的事件空間,所以感覺它應該可以作業。
uj5u.com熱心網友回復:
我認為這是沙盒 GUI 支持中的一個錯誤。啟用 GUI 模式后,它會創建一個事件空間并在該事件空間的處理程式執行緒中運行評估回圈。但是評估回圈會阻塞在等待評估的通道上,因此它會阻止事件空間處理實際的 GUI 事件。
一種解決方法是(current-eventspace (make-eventspace))在執行涉及當前事件空間的任何其他操作之前在評估器中運行,例如創建框架。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/482879.html
