8

我正在尝试学习如何使用图表库和 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

我试过使用“defaultRender”(如上所述),但这会产生类型错误:显然“win”不是正确的类型。

我已经阅读了图表的教程和用户手册,但它实际上并没有告诉你如何使用 Cairo 后端。

更新:我有要渲染的椭圆。“renderFigure”函数现在说:

renderFigure :: DrawingArea -> EventM EExpose Bool
renderFigure canvas = do
   -- win <- eventWindow
   liftIO $ do
      -- diagramArea <- widgetGetDrawWindow canvas 
      -- renderToGtk diagramArea $ toGtkCoords figure
      defaultRender canvas figure
   return True

而传入的DrawingArea是“画布onexposeEvent...”设置中引用的“画布”。

但我仍然无法使用“renderToGtk”渲染固定大小的图表。

更新 2:感谢 Joachim Breitner 的回答,我现在得到了一个看起来像这样的最小的 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 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  
4

2 回答 2

6

您的初始代码实际上有效。但是 renderToGtk 不缩放图像,所以它看起来相当小,太小以至于在那个线宽处不可见。但是试试

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

它会像魅力一样发挥作用!

于 2012-08-09T18:04:42.197 回答
2

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

import Diagrams.Backend.Gtk

代替

import Diagrams.Backend.Cairo.Gtk

figure :: Diagram Cairo

代替

figure :: Diagram Cairo R2

结果现在看起来像:

module Main where

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

main :: IO ()
main = do
  initGUI
  window <- windowNew
  canvas <- drawingAreaNew
  canvas `on` sizeRequest $ return (Requisition 256 256)
  Graphics.UI.Gtk.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
figure =  unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50 # fc red
于 2016-05-31T00:21:52.547 回答