perl tk text: невозможно получить текстовое содержимое в переменную

Все, что я хотел, это многострочный текстовый ввод.

Поэтому я использовал TK::Text вместо TK::Entry.

use Tk;

my $mw = MainWindow->new(-width => '1000', -relief => 'flat',
   -height => '840', -title => 'Test', -background => 'white', );    
$mw->geometry("1000x840+200+200");

my $desc = $mw->Scrolled('Text', -scrollbars => 'e', 
   -width => 50, -height => 3)->place(-x => 10, -y => 170);

my $goButton = $mw->Button( -pady => '1', -relief => 'raised',
   -padx => '1', -state => 'normal', -justify => 'center',
   -text => 'Go', -width => 15, -height => 1,
   -command => sub {$mw->destroy;})->place( -x => 12, -y => 770);

my $cancelButton = $mw->Button( -pady => '1', -relief => 'raised',
  -padx => '1', -state => 'normal', -justify => 'center',
  -text => 'Cancel', -width => 8, -height => 1,
  -command => sub { exit 0; })->place( -x => 140, -y => 770);

$mw -> MainLoop();

print $desc->get('1.0');

Но когда я запускаю этот код, я получаю эту ошибку:

Не удалось АВТОЗАГРУЗИТЬ 'Tk::Frame::get'

Что я делаю не так?

Спасибо!


person AJ Gottes    schedule 15.05.2016    source источник


Ответы (1)


$mw->MainLoop() устанавливает цикл ожидания событий от мыши, клавиатуры, таймера и всего, что вы используете. $desc->получить('1.0'); не будет выполняться, пока вы не выйдете из приложения. Вы можете переместить его выше, и это решит проблему, которую вы задаете.

Однако ваша реальная проблема заключается в том, чтобы получить текст, например, в Entry() и использовать его в своем приложении. Посмотрите хороший туториал, например, http://docstore.mik.ua/orelly/perl3/tk/ch05_02.htm.

ОБНОВЛЕНИЕ 16 мая: что вы хотите сделать: введите текст в окно, а затем нажмите «Перейти»? Попробуй это:

use strict;
use warnings;
use Tk;

my $mw = MainWindow->new(-width => '1000', -relief => 'flat',
   -height => '840', -title => 'Test', -background => 'white', );
$mw->geometry("1000x840+200+200");

my $desc = $mw->Text(-width => 50, -height => 3)->place(-x => 10, -y => 170);

my $goButton = $mw->Button( -pady => '1', -relief => 'raised',
   -padx => '1', -state => 'normal', -justify => 'center',
   -text => 'Go', -width => 15, -height => 1,
    -command => sub {\&fromGo($desc) })->place( -x => 12, -y => 770);
my $cancelButton = $mw->Button( -pady => '1', -relief => 'raised',
  -padx => '1', -state => 'normal', -justify => 'center',
  -text => 'Cancel', -width => 8, -height => 1,
  -command => sub { exit 0; })->place( -x => 140, -y => 770);
$mw->MainLoop();


sub fromGo
{
  my($desc) = @_;
  my $txt = $desc->get('1.0', 'end-1c');
  print "$txt\n";
}
person Jorgen    schedule 15.05.2016
comment
если я передвину печать перед основным циклом, она напечатает пустую строку... я не понимаю... - person AJ Gottes; 15.05.2016
comment
Для многострочного ввода: да, используйте Text(), но, пожалуйста, прочитайте учебник по тексту, например, в книге, на которую я ссылаюсь, и сделайте все возможное. Книга отличная. - person Jorgen; 15.05.2016
comment
Вам также следует попробовать запустить команду widget из командной строки (по крайней мере, в Linux). виджет представляет собой интерактивный учебник. - person Jorgen; 15.05.2016