1

我有一个 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 调用 run 过程来执行。虽然该过程需要一段时间,但 GUI 冻结,不允许我对其执行任何操作。我什至不能在笔记本 GUI 中从一页转到另一页。

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

谢谢。

4

2 回答 2

5

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

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

各有利弊。

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

于 2013-10-17T11:10:36.613 回答
0

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

于 2013-10-17T11:17:07.300 回答