所以我用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语言.这对于科学的东西非常有用,除了介绍性编程类之外.
解决方法
#!/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;