Perl Tk: путаница с обновлением текстового окна - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть небольшое приложение на Perl Tk с текстовым окном, которое я хочу обновлять небуферизованным способом, как я делаю с моими файлами журналов, но я не могу заставить его работать из-за моего плохого понимания всего, что нужно делать с Perl.

Приложение читает индекс XML, анализирует его, а затем загружает каждый идентификатор, найденный в XML, в качестве URL-адреса для кэширования страницы. Их число может быть от 1700 до 19 000, в зависимости от того, какой $ pubId введен и занимает пару часов.

У меня есть следующий код для кнопки Отправить и текстового окна:

my $submit_image = $pict->Photo(-file => $submit);
    my $submit_button = $mw->Button(
    -image => $submit_image,
    -text => "Submit", 
    -background => "#cccccc",
    -command => sub {

        if ($pubId eq '') {
            $|;
    Log_message ("\n$DATE - $TIME - WARNING: Please complete all fields\t");
    tk_message ("Please enter a valid Publication ID");
}
else {  
    request_url(); #Open the xml url and read it in
    }
    $text->insert( 
                # put something to the _end_ of the text
                # which is in the widget
                'end', 
                sprintf(" $txtmesg\n")  
            );
            # Set window to the end of the text
            # I want to see the newest events immediately
            $text->see('end');  
        }) ->place( -x => 60, -y =>195);

, который работает, если кнопка нажата с пустым или недействительным $ pubId (request_url выполняет дополнительную проверку, чтобы увидеть, содержит ли тело html слово 404 и выводит ли сообщение в окно).

Но если все в порядке и request_url () выполняется, то все окно Tk зависает, и я не могу использовать кнопку выхода и вынужден закрывать ее через командную строку.

Я знаю, что я должен делать это по-другому, но пока каждый сайт, на который я смотрел, слишком сложен для меня, и я просто сбит с толку. Мне нужны какие-то хитрые инструкции, чтобы я мог через это пройти.

Спасибо.

РЕДАКТИРОВАТЬ: Я попытался использовать MainLoop (); и DoOneEvent (): внутри моего саба, но я все еще вижу то же графическое замораживание интерфейса и никаких обновлений окна.

Я продолжу исследования и эксперименты.

-command => \&long_job)

MainLoop();

    sub long_job {
        if ($pubId eq '') {
            $|;
    Log_message ("\n$DATE - $TIME - WARNING: Please complete all fields\t");
    tk_message ("Please enter a valid Publication ID");
}
else {  
    DoOneEvent();
    request_url(); #Open the xml url and read it in
    }   
     }

1 Ответ

0 голосов
/ 01 сентября 2014

Не уверен, поможет ли это другим с подобной проблемой, но на всякий случай:

MainLoop();

- это то, что «запускает» процесс tk.Хорошей практикой будет настроить все ваши виджеты, обратные вызовы и все, что вы хотите, чтобы сначала отображаться на экране, а затем вызвать MainLoop().Обработка должна происходить после , когда вызывается MainLoop().В приведенном выше примере вам, вероятно, нужно будет вызывать

$myLabel->update;

внутри цикла для того, что вы используете для отображения выходных данных.В моем случае я использовал Label для вывода сообщений о ходе выполнения в цикле, который совершал вызовы, используя system().Использование ->update решило это идеально (в то время как DoOneEvent() не помогло).

Надеюсь, что это кому-нибудь поможет.

...