使用Perl和Gtk2(或Gtk3),我想在GUI應用程序中顯示圖形。如何在Perl Gtk GUI中顯示圖形?
Chart :: Clicker看起來很有前途,但它似乎只寫入文件。有沒有辦法讓它進入GtkDrawingArea或類似的?
使用Perl和Gtk2(或Gtk3),我想在GUI應用程序中顯示圖形。如何在Perl Gtk GUI中顯示圖形?
Chart :: Clicker看起來很有前途,但它似乎只寫入文件。有沒有辦法讓它進入GtkDrawingArea或類似的?
經過大量的實驗,我找到了答案。
通過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);
在Gtk 3.10中引入了set_from_surface()方法。 RHEL 7只有Gtk 3.8.8,因此這個示例在那裏不起作用。 – TheAmigo 2015-04-15 01:25:45
你可以創建一個[ '開羅'](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
另一個好處是你可以通過更具體的問題來處理你的代碼,並獲得更具體和有用的回答。這些是評論,所以他們得到一個非常有幫助的通行證;-) – 2015-04-07 14:25:37