首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Perl +X窗口中没有事件循环图形吗?

在Perl +X窗口中没有事件循环图形吗?
EN

Stack Overflow用户
提问于 2012-09-30 02:13:25
回答 4查看 682关注 0票数 6

在20世纪80年代的Apple II BASIC上,你会使用"HGR“来进入屏幕,"HCOLOR”将设置颜色,而"HPLOT“则会设置情节点。您还可以操作屏幕字节数据,并且不必将程序控制交给任何事件处理程序。这种可笑的初级功能今天似乎在每一种语言和每一个库中都缺失了。

所以我用X窗口 API在C中编写了一个小库来实现这一点: HGR(x,y)设置一个XWindow,HCOLOR(i)设置颜色,HPLOT(i,j)绘制一个点,然后提取窗口的位图并修改它并显示修改后的内容。这并不直接,我不想再经历一次。

我现在正在为一些事情使用Perl,我需要这样一个用于Perl的工具,在这个工具中,您可以调用一个子例程,该子程序最好不会生成一个新线程,有一个输出窗口,您可以在该窗口中添加图形内容,并在您的程序喜欢的时候查询事件。这是1980年代BASIC的功能,所以应该不难。但我看到的工具并没有起作用:

  • 据我所见,这是图形文件,而不是图形窗口。似乎你需要把它传送到另一个程序。
  • Gtk2:我必须用一个单独的线程来捕获事件,否则它就不会显示窗口。我不想吃任何东西,而且我基本上不关心任何事情,除非我特别要求以后看到排队的东西被堆起来。
  • Qt:在这里,您还需要将控制交给事件处理程序,不处理,不显示。在C++版本中,我可以在没有切换的情况下获得Qt显示和绘图。
  • PerlTk:再来一次愚蠢的交接。
  • OpenGL:在这里,我不知道如何捕捉X窗口事件,就像按键一样,当我想看看发生的事情时。

有没有人知道如何从运行中的应用程序中安装一个XWindow,而不需要分叉出一个GUI应用程序进程,在那里您可以在窗口中绘制诸如点和线之类的原始内容,以及在哪里可以按照自己的计划查询窗口的事件?我简要介绍了用于Perl的X Window API,它与C一样可怕,C代码与Perl的接口也是可怕的。如果有必要,我会去做的。但也许不是。Perl已经有HGR了吗?

如果您想知道我的意思,没有事件循环图形库,请参阅这种连纸,不幸的是C。除了入门编程类之外,这样的东西对于科学知识非常有用。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-01 02:29:11

几乎每个GUI工具包都支持在不进入事件循环的情况下构建窗口。下面是tk示例

代码语言:javascript
复制
#!/usr/bin/perl --
use strict;
use warnings;
use Tk;
my $mw = tkinit();
my $ca = $mw->Canvas(
    background => 'white'
)->pack(qw/-expand 1 -fill both /);
$mw->geometry( '500x600+10+10' );
for my $cc (
    { red   => \&red, green => \&der, blue => \&erd },
    { green => \&red, red   => \&der, blue => \&erd },
    { green => \&red, blue  => \&der, red  => \&erd },
  )
{
    $ca->delete('all');
    my %color = %$cc;

    for my $fill ( keys %color ) {
        my $red = $color{$fill};
        for my $t ( 10 .. 220 ) {
            my $d = 0.1;
            my ( $x, $y ) = $red->( $t, 0.1 );
            $_ += 250 for $x, $y;
            $ca->createOval(
                $x, $y,
                ( $t * 2 * $d ) + $x,
                ( $t * 2 * $d ) + $y,
                -fill => $fill,
            );
            $mw->update;
            select undef, undef, undef, 0.001;
        }
        $mw->update;
    }
}

Tk::DoOneEvent(0) while Tk::MainWindow->Count; ## MainLoop;
exit 0;

sub red {
    my ( $t, $d ) = @_;
    my $x = $t * sin( $t * $d );
    my $y = $t * cos( $t * $d );
    $x, $y;
}

sub der {
    my ( $t, $d ) = @_;
    my $x = $t * sin( $t * $d );
    my $y = $t * cos( $t * 2 * $d );
    $x, $y;
}

sub erd {
    my ( $t, $d ) = @_;
    my $x = $t * sin( $t * 2 * $d );
    my $y = $t * cos( $t * $d );
    $x, $y;
}

__END__

Gtk2和Wx都支持相同的东西,它要么更新/显示/显示.然后绘制窗口,当您想要用户交互时,调用MainLoop或运行应用程序或自己处理它,这只是一段时间循环分派挂起的事件。

代码语言:javascript
复制
wxTheApp->Dispatch       while wxTheApp->Pending;
Gtk2->main_iteration     while Gtk2->events_pending;
票数 4
EN

Stack Overflow用户

发布于 2012-10-01 05:00:09

我建议使用Perl模块内联::C。该模块使向您的Perl应用程序公开C库变得非常容易。对于一些C库,'AUTOWRAP‘选项使它变得非常简单。但是,即使您必须自己编写一些包装器,内联::C也确实减轻了XS的负担。

票数 1
EN

Stack Overflow用户

发布于 2012-09-30 13:11:09

我不太清楚您的最终目标是什么,这可能没有帮助,但也许您想看看David的App::Prima::REPL。David一直在构建一个基于绘图库图形工具包的Perl/PDL。为了达到逻辑上的极端,他围绕REPL构建了一个REPL,创建了一个带有内置绘图的GUI REPL。正如您所说的,Prima依赖于一个事件循环来运行,但是,因为您在REPL中,所以仍然可以指示REPL绘制新数据。他的目标也是科学运用!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12658086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档