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

问题描述 投票:1回答:2

我有一个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();

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

有人可以引导我吗?我是perl新手。

谢谢。

perl tk perltk
2个回答
5
投票

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

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

每个都有优点和缺点。

这里是one example,使用线程方法;我认为这可能对您有用。


0
投票

我对tk不太了解,除了一些基本的知识,但是为什么要在那个地方运行那个Sub?通常我会假设您希望某个按钮或其他UI元素使用某种-command => {$obj->run()}启动该子例程。但是,应该始终从主程序派生执行代码。但是不知道run()$obj做什么,很难说让它们平行于主循环运行是否可行。

© www.soinside.com 2019 - 2024. All rights reserved.