perl tk - 当执行perl模块中的过程时,如何保持GUI活动



我有一个perl tk例程,从导入的perl模块调用一个过程。执行子例程时,GUI 挂起。这是我正在使用的代码摘录。有人可以建议一种更好的方法来执行此操作,以便在程序运行时GUI处于活动状态吗?

use Tk;
use package1;

$mw = MainWindow->new;
$mw->geometry("+10+10");
$mw->title("My notebook GUI");
my $mwFrame = $mw->Frame(-borderwidth => 2, -relief => 'ridge')->pack(-fill=> 'none',-fil=> 'x');
my $nb = $mwFrame->NoteBook(-dynamicgeometry => 'true',-ipadx => 20, -ipady => 20)->pack(-expand => 1,-fill => 'both');             
$page1 = $nb->add( 'Page1',     -label => 'Page 1' );
$page2 = $nb->add( 'Page2',     -label => 'Page 2' );
    $page1->pack();
    $page2->pack();
    $button1 = $page1->Button(-text => "Not Selected", -background => 'gray', -state => 'disabled')->pack(-side => 'right', -expand => 0);
    $button2 = $page2->Button(-text => "Not Selected", -background => 'gray', -state => 'disabled')->pack(-side => 'right', -expand => 0);
    my $obj = package1->new();
    my $obj->run();

在上面的代码中,我正在从要执行的包 1 调用运行过程。虽然该过程需要一段时间,但 GUI 会冻结,不允许我对其执行任何操作。我什至无法在笔记本 GUI 中从一页转到另一页。

有人可以指导我吗?我是一个perl新手。

谢谢。

欢迎来到并发编程的世界。一般而言,这里有三种主要方法:

  1. 线程
  2. 货叉/管
  3. 协作式多任务处理/事件循环

每个人都有优点和缺点。

下面是使用线程方法的一个示例;我认为这可能对你有用。

除了

一些基本的东西外,我自己不太精通tk,但是你为什么要在那个地方运行那个Sub呢?通常,我会假设您希望某些按钮或其他 UI 元素使用某种-command => {$obj->run()}启动子例程。然而,所有方法都应该起作用的是从您的主程序中分叉以执行。但是,如果不知道run()$obj做什么,就很难说让它们与主循环平行运行是否可行。

最新更新