Динамическое обновление сюжета в Хаскеле - PullRequest
5 голосов
/ 02 октября 2011

У меня есть программа, которая выполняет долгосрочные вычисления, где результат отображается в виде графика. В настоящее время я использую Chart-0.14 для этого. Я хочу показать частичные результаты и обновить во время расчетов. Graphics.Rendering.Chart.Gtk.updateCanvas :: Renderable a -> DrawingArea -> IO Bool, кажется, делает это, но я не нахожу способа получить DrawingArea из графика. Функция renderableToWindow :: Renderable a -> Int -> Int -> IO () не возвращает ничего (и, кроме того, не возвращает до закрытия окна).

Я бы хотел сделать что-то вроде следующего:

main = do
drawingArea = forkRenderableToWindow (toRenderable $ plotLayout $
                     plot [0,0.1..10] sin "sin(x)") 640 480
updateCanvas  (toRenderable $ plotLayout $  plot [0,0.1..10] sin "sin(x)") drawingArea

Как мне это сделать? Должен ли я переопределить функции в Graphics.Rendering.Chart.Gtk версией, которая возвращает DrawingArea и каким-то образом (как бы я это сделал? ForkIO?), Немедленно возвращает без закрытия окна?

1 Ответ

2 голосов
/ 02 октября 2011

Вы ищете createRenderableWindow, а затем вам нужно использовать операции GTK для работы с данным Window - я не думаю, что пакет Chart экспортирует какие-либо операции более высокого уровня на Window s.

EDIT2: так что игнорируйте нижеприведенное - он не работает даже при инициализации GUI. Мой комментарий был предположением, основанным на типах. РЕДАКТИРОВАТЬ: Вот пример кода. Поймите, я просто соединяю вещи в зависимости от типов. Возможно, есть лучшие способы сделать что-то, если вы спросите кого-то, кто действительно знает библиотеку.

Ниже мы используем:

  1. createRenderableWindow - суть моего ответа
  2. castToDrawingArea - Это необходимо для получения DrawingArea от типа Window, предоставленного GTK. Я думаю, что эти приведения происходят из-за наследования С ++.
  3. widgetShowAll - поскольку мы на самом деле не отображали окно, нам лучше всего это сделать. Я украл эту функцию после просмотра источника renderableToWindow.
  4. updateCanvas - Я только что увидел это в документации по пикше и подумал, что именно поэтому вы хотели DrawingArea, во-первых.

Теперь для кода:

import Graphics.Rendering.Chart.Gtk
import Graphics.Rendering.Chart.Renderable
import Graphics.UI.Gtk.Misc.DrawingArea
import qualified Graphics.UI.Gtk as G

main = do
        win  <- createRenderableWindow emptyRenderable 400 400
        let draw = castToDrawingArea win
        G.widgetShowAll win
        updateCanvas emptyRenderable draw
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...