gpt4 book ai didi

perl - Perl 加 X Window 中没有事件循环图形?

转载 作者:行者123 更新时间:2023-12-01 20:22:58 25 4
gpt4 key购买 nike

在 20 世纪 80 年代的 Apple II BASIC 上,您可以使用“HGR”来进入屏幕,“HCOLOR”将设置颜色,“HPLOT”将绘制点。您还可以操纵屏幕字节数据,并且不必将程序控制权交给任何事件处理程序。如今,每种语言和每个库似乎都缺少这种极其基本的功能。

所以我编写了一个小型库,使用 X Window 在 C 中执行此操作。 API:HGR(x,y) 建立一个 XWindow,HCOLOR(i) 设置颜色,HPLOT(i,j) 绘制一个点,再加上您提取窗口的位图并可以对其进行修改并显示修改后的内容。这并不简单,我不想再经历一遍。

我现在正在使用 Perl 来做一些事情,我需要这样一个 Perl 工具,你可以在其中调用一个子例程,最好在不生成新线程的情况下返回,输出一个窗口,你可以在其中添加图形内容到窗口,并在程序需要时查询事件。这是 20 世纪 80 年代 BASIC 的功能,所以应该不难。但我看到的工具并没有做到这一点:

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

有谁知道如何从正在运行的应用程序中建立一个XWindow,而不需要创建一个GUI应用程序进程,您可以在窗口中绘制基本的东西,如点和线,以及在您的计算机上查询窗口的事件。自己的时间表?我简单地浏览了 Perl 的 X Window API,它和 C 一样可怕,并且 C 代码与 Perl 的接口(interface)也很可怕。如果需要的话,我会做的。但也许不是。 Perl 已经有 HGR 了吗?

如果您想知道我的意思,没有事件循环图形库,请参阅 this linked paper ,不幸的是,这适用于 C。这样的东西对于入门编程类(class)之外的科学内容非常有用。

最佳答案

几乎每个 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 => \&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或运行应用程序或自己处理它,它只是一个while 循环调度待处理事件

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

关于perl - Perl 加 X Window 中没有事件循环图形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12658086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com