2015-04-05 46 views
3

使用Perl和Gtk2(或Gtk3),我想在GUI應用程序中顯示圖形。如何在Perl Gtk GUI中顯示圖形?

Chart :: Clicker看起來很有前途,但它似乎只寫入文件。有沒有辦法讓它進入GtkDrawingArea或類似的?

+0

你可以創建一個[ '開羅'](https://metacpan.org/pod/Cairo)「context」/「surface」對象,然後只寫入它?這可能比這更復雜,但我確信Brian Manning(GTK和Cairo模塊的XAOC作者)可以提供指導。在你完成項目的過程中,你可以編寫文檔並改進POD :-) GPHAT在「Chart :: Clicker」**上的工作是驚人的(GPHAT的靈感來自於Tufte!),但是[GPHAT自己指出](http ://www.onemogin.com/observability/charting/a-chart-is-worth-some-words.html)圖表中的很多操作現在都是「客戶端」。 – 2015-04-07 14:21:12

+0

另一個好處是你可以通過更具體的問題來處理你的代碼,並獲得更具體和有用的回答。這些是評論,所以他們得到一個非常有幫助的通行證;-) – 2015-04-07 14:25:37

回答

2

經過大量的實驗,我找到了答案。

  1. 請勿使用Gtk :: DrawingArea,請使用Gtk :: Image。
  2. $ img-> set_from_surface($ chart-> driver-> surface);

通過Source :: Chart :: Clicker的閱讀,我發現$ chart-> driver是開羅的對象,而 - > surface是實際的開羅表面。 Gtk :: Image可以基於開羅表面直接繪製。

,說明如何做到這一點的完整方案:

#!/usr/bin/perl -w 
use strict; 
use Gtk3 -init; 
use Chart::Clicker; 
use Chart::Clicker::Data::Series; 
use Chart::Clicker::Data::DataSet; 
my $win = Gtk3::Window->new; 
my $img = Gtk3::Image->new; 
$win->add($img); 
my $chart = Chart::Clicker->new; 
my $dataset = Chart::Clicker::Data::DataSet->new(
     series => [Chart::Clicker::Data::Series->new(
       keys => [1, 2, 3, 4, 5], 
       values => [2, 3, 5, 7, 11], 
     )], 
); 
$chart->add_to_datasets($dataset); 
$chart->draw; 
$img->set_from_surface($chart->driver->surface); 
$win->signal_connect(destroy => sub{Gtk3->main_quit}); 
$win->show_all; 
Gtk3::main; 

更新

在Gtk3 < 3.10,替換包含set_from_surface與行:

my $loader = Gtk3::Gdk::PixbufLoader->new; 
$chart->driver->surface->write_to_png_stream(sub { 
    $loader->write([unpack 'C*', $_[1]]); 
}); 
$loader->close; 
$img->set_from_pixbuf($loader->get_pixbuf); 
+0

在Gtk 3.10中引入了set_from_surface()方法。 RHEL 7只有Gtk 3.8.8,因此這個示例在那裏不起作用。 – TheAmigo 2015-04-15 01:25:45