Haskell 如何将图表库与GTK绘图工具一起使用?

Haskell 如何将图表库与GTK绘图工具一起使用?,haskell,gtk,haskell-diagrams,Haskell,Gtk,Haskell Diagrams,我正在尝试学习如何使用和Cairo/GTK后端绘制图表。我有一个空白窗口要显示,但我的画无法渲染。我做错了什么 module Main where import Control.Monad.Trans (liftIO) import Graphics.UI.Gtk import Diagrams.Backend.Cairo import Diagrams.Backend.Cairo.Gtk import Diagrams.Prelude main :: IO () main = do i

我正在尝试学习如何使用和Cairo/GTK后端绘制图表。我有一个空白窗口要显示,但我的画无法渲染。我做错了什么

module Main where

import Control.Monad.Trans (liftIO)
import Graphics.UI.Gtk
import Diagrams.Backend.Cairo
import Diagrams.Backend.Cairo.Gtk
import Diagrams.Prelude

main :: IO ()
main = do
  initGUI
  window <- windowNew
  canvas <- drawingAreaNew
  canvas `on` sizeRequest $ return (Requisition 1000 1000)
  set window [ containerBorderWidth := 10,
               containerChild := canvas ]
  canvas `on` exposeEvent $ renderFigure
  onDestroy window mainQuit
  widgetShowAll window
  mainGUI


renderFigure :: EventM EExpose Bool
renderFigure = do
   win <- eventWindow
   liftIO $ renderToGtk win $ toGtkCoords figure
   -- liftIO $ defaultRender win figure
   return True


figure :: Diagram Cairo R2
figure =  unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50

您的初始代码实际上是有效的。但renderToGtk不会缩放图像,因此它看起来相当小,太小,在该线宽处不可见。但是试试看

figure :: Diagram Cairo R2
figure =  unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50 # fc red

它将像一个符咒一样工作

您可以注意到,在最新版本的图表中,您应该使用

import Diagrams.Backend.Gtk
而不是

import Diagrams.Backend.Cairo.Gtk

figure::Diagram Cairo
而不是

figure::Diagram开罗R2
现在的结果如下所示:

modulemain其中
进口控制单体转运(liftIO)
导入Graphics.UI.Gtk
导入Diagrams.Backend.Cairo
导入Diagrams.Backend.Gtk
导入图表。序曲
main::IO()
main=do
initGUI

窗口你得到了什么错误?您的原始代码在这里编译和运行(尽管它没有绘制任何内容);它只是没有画出任何东西。约阿希姆已经回答了。啊,我发现我误读了这个问题,认为“类型错误”一句是关于未注释代码的。道歉。
module Main where

import Control.Monad.Trans (liftIO)
import Graphics.UI.Gtk
import Diagrams.Backend.Cairo
import Diagrams.Backend.Cairo.Gtk
import Diagrams.Prelude

main :: IO ()
main = do
  initGUI
  window <- windowNew
  canvas <- drawingAreaNew
  canvas `on` sizeRequest $ return (Requisition 256 256)
  set window [ containerBorderWidth := 10,
               containerChild := canvas ]
  canvas `on` exposeEvent $ renderFigure
  onDestroy window mainQuit
  widgetShowAll window
  mainGUI


renderFigure :: EventM EExpose Bool
renderFigure = do
   win <- eventWindow
   liftIO $ renderToGtk win $ toGtkCoords figure
   return True


figure :: Diagram Cairo R2
figure =  unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50 # fc red  
figure :: Diagram Cairo R2
figure =  unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50 # fc red