我正在尝试使用 GTK3 和 WebKit 在 Haskell 中制作一个简单的应用程序。此代码创建并显示一个包含WebView
内部的窗口,每次按下键时都会显示一个随机数。
import Control.Monad.Trans (lift)
import Control.Concurrent (forkOS)
import System.Random (randomIO)
import Graphics.UI.Gtk -- gtk3
import Graphics.UI.Gtk.WebKit.WebView -- webkitgtk3
main = forkOS $ do
-- Init GTK.
initGUI
-- Create a window which would finish the GTK loop
-- after being closed.
window <- windowNew
window `after` objectDestroy $
mainQuit
-- Create a WebView inside.
webView <- webViewNew
set window [containerChild := webView]
-- Make the WebView display a random number on key press.
webView `on` keyReleaseEvent $ lift $ do
x <- randomIO :: IO Int
webViewLoadString webView (show x) Nothing Nothing ""
return True
-- Run GTK.
widgetShowAll window
mainGUI
当我在 GHCi (7.8.3) 中运行它时,它运行良好。然而,当我在不退出 GHCi 的情况下再次运行它时,它WebView
从不显示任何东西——只是纯白色区域。这令人不安,因为我喜欢在 GHCi 中修改代码。
forkOS
当然,如果我不在主线程中使用和运行整个东西,一切都会很好。这种限制的原因是什么(我认为所有 GTK 函数都认为“主”线程是initGUI
被调用的线程),并且可以以某种方式克服它吗?