perl - 如何在 Perl Gtk GUI 中显示图形?

标签 perl charts gtk

使用 Perl 和 Gtk2(或 Gtk3),我想在 GUI 应用程序中显示图形。

Chart::Clicker 看起来很有前途,但它似乎只能写入文件。有没有办法将它放入 GtkDrawingArea 或类似的?

最佳答案

经过大量实验,我弄明白了。

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

通过阅读 Chart::Clicker 的源代码,我发现 $chart->driver 是 Cairo 对象,而 ->surface 是实际的 Cairo 表面。 Gtk::Image 可以直接基于 Cairo surface 绘制。

说明如何执行此操作的完整程序:

#!/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);

关于perl - 如何在 Perl Gtk GUI 中显示图形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29462912/

相关文章:

python - GtkLabel 的一部分可点击

我可以为鼠标按钮设置全局 GTK 加速器吗?

Perl 触发器运算符和行号

javascript - 如何在条形图上放置标签 google.charts.Bar()

perl - 如何使 Mojolicious 的 url_for()->to_abs() 在 nginx 后面返回正确的方案(http 或 https)

javascript - 如何修复chartJS中水平点(x轴)之间的距离

javascript - 如何从 Google 的可视化 API 生成的条形图中删除 x 轴?

使用 GTK 的 C 编程指针转换

perl - 在 @INC 中找不到 Config.pm

perl - 如何解决 Perl 中的一组约束?