加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl和X Window中没有事件循环图形?

发布时间:2020-12-16 06:25:17 所属栏目:大数据 来源:网络整理
导读:在20世纪80年代的Apple II BASIC上,您将使用“HGR”进入屏幕,“HCOLOR”将设置颜色,“HPLOT”将绘制点.您还可以操作屏幕字节数据,而不必将程序控制交给任何事件处理程序.今天,每种语言和每个图书馆似乎都缺少这种荒谬的基本功能. 所以我用C语言编写了一个小
在20世纪80年代的Apple II BASIC上,您将使用“HGR”进入屏幕,“HCOLOR”将设置颜色,“HPLOT”将绘制点.您还可以操作屏幕字节数据,而不必将程序控制交给任何事件处理程序.今天,每种语言和每个图书馆似乎都缺少这种荒谬的基本功能.

所以我用C语言编写了一个小型库,使用X Window API:HGR(x,y)设置XWindow,HCOLOR(i)设置颜色,HPLOT(i,j)绘制一个点,再加上你提取窗口的位图,可以修改它并显示修改过的东西.这不是直截了当的,我不想再次通过它.

我现在正在使用Perl做一些事情,我需要Perl这样的工具,你可以调用一个子程序,最好在没有产生新线程的情况下返回,输出一个窗口,你可以在窗口中添加图形内容,以及在您的程序感觉它时查询事件.这是1980年代BASIC的功能,所以它应该不难.但是我看到的工具没有这样做:

> GD:据我所知,这会产生图形文件,而不是图形窗口.看来你需要把它管道到另一个程序.
> Gtk2:我必须派出一个单独的线程来捕获事件,否则它将不会显示窗口.我不想分叉任何东西,而且我大多不关心任何事件,除非我特别要求稍后看到堆积在队列中的东西.
> Qt:在这里,您还需要将控制权移交给事件处理程序,不要切换,不显示.在C版本中,我可以让Qt显示和绘制而无需切换.
> PerlTk:再次与愚蠢的交接.
> OpenGL:在这里,当我想看看发生了什么时,我不知道如何抓住X Window事件,比如按键.

有没有人知道如何从正在运行的应用程序中放置一个XWindow,而不需要一个GUI应用程序进程,在这里您可以在窗口中绘制原始内容,如点和线,以及您可以按照自己的计划查询窗口事件的位置?我简要地看了一下Perl的X Window API,它和C一样可怕,并且将C代码与Perl连接起来也是可怕的.如有必要,我会这样做.但也许不是. Perl有没有HGR?

如果您想知道我的意思,没有事件循环图形库,请参阅this linked paper,遗憾的是C语言.这对于科学的东西非常有用,除了介绍性编程类之外.

解决方法

几乎每个GUI工具包都支持构建窗口而无需进入事件循环.这是tk的例子

#!/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  => &;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,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或运行应用程序或自己处理它,它只是一个while循环调度待定事件

wxTheApp->Dispatch       while wxTheApp->Pending;
Gtk2->main_iteration     while Gtk2->events_pending;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读