У меня есть небольшое приложение на 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
}
}