wxPerl: добавить компонент, который автоматически изменяет размер при изменении размера родительского фрейма
Я относительно новичок в Perl, и я использую wxPerl
создать приложение с графическим интерфейсом. Теперь я хочу добавить Panel
в Frame
возможно используя sizer
так что размер панели изменяется автоматически при изменении размера рамки.
Итак, вот что я получил:
(1) Я должен использовать BoxSizer
, которые растягивают компоненты в одном направлении.
(2) Я должен передать параметры в Add
подпрограммы для растягивания компонентов в другом направлении.
Я написал следующий код:
package Main;
use Wx;
use parent 'Wx::App';
sub OnInit {
my $frame = Wx::Frame->new(undef, -1, "SimpleCalc ".$Information::VERSION_NO, [-1,-1], [-1,-1]);
my $centerPanel = Wx::Panel->new($frame, -1, [-1,-1], [-1,-1]);
#set red background
$centerPanel->SetBackgroundColour(Wx::Colour->new(255,0,0));
my $frameSizer = Wx::BoxSizer->new(wxHORIZONTAL);
$frameSizer->Add($centerPanel, 1, 0, 0);
$frame->SetSizer($frameSizer);
$frame->Center();
$frame->Show(1);
return 1;
}
my $app = Main->new;
$app->MainLoop;
Нежелательный результат:
Я хочу растянуть красную панель как в горизонтальном, так и в вертикальном направлении, или, короче говоря, я хочу что-то похожее на BorderLayout
в Java
,
Согласно некоторым онлайн-учебникам, я пытался заменить $frameSizer->Add($centerPanel, 1, 0, 0);
с $frameSizer->Add($centerPanel, 1, wxEXPAND, 0);
, но скрипт не запускается. Происходит ошибка, сообщающая, что не удается разрешить перегрузку для Wx::Sizer::Add(Wx::Panel, number, scalar, number). Я тоже пробовал $frameSizer->Add($centerPanel, 1, 0, 0, wxEXPAND);
, но полученный кадр точно такой же, как кадр на изображении.
Возможно ли иметь что-то похожее на Java? BorderLayout
в wxPerl
? Заранее спасибо.
PS Я знаю, что есть дубликат, но нет конкретных ответов...
1 ответ
Обновить
В случае, если вы не знали, размер по умолчанию для любого дочернего окна заполнит его доступное пространство, поэтому для достижения эффекта, который вы запрашиваете, все, что вам нужно, это
use strict;
use warnings;
package Information;
our $VERSION_NO = 9.99;
package Main;
use Wx qw/ :colour /;
use parent 'Wx::App';
sub OnInit {
my $frame = Wx::Frame->new(undef, -1, "SimpleCalc $Information::VERSION_NO");
my $centerPanel = Wx::Panel->new($frame);
$centerPanel->SetBackgroundColour(wxRED);
$frame->Center;
$frame->Show;
return 1;
}
my $app = Main->new;
$app->MainLoop;
оригинал
Это очень помогло бы тебе, если бы ты use strict
а также use warnings
на месте! Я и несколько других должны бесконечно поощрять людей делать это, но иногда кажется, что сообщение никогда не будет донесено. Пожалуйста, постарайтесь добавлять эти утверждения в начало каждой написанной вами Perl-программы и помогать нам распространять информацию
Есть две вещи, мешающие вашей программе работать
Значение
wxHORIZONTAL
не определено, потому что вы не импортировали его изWx
, так что вы передаете нулевое значениеWx::BoxSizer->new
без предупрежденияВы использовали нулевое значение для третьего параметра
$frameSizer->Add
, что предотвращает поперечное расширение панели в направлении калибратора. Тебе нужноwxEXPAND
там, чтобы включить его, и вам также нужно будет импортировать значение этой константы, конечно,
Вот переписать ваш код, который решает эти проблемы, а также использует преимущества по умолчанию, которые будут использоваться для пропущенных параметров. Я также использовал wxRED
вместо создания нового Wx::Colour
объект. Я должен был установить значение для $Information::VERSION_NO
тоже
Этот код работает как вы ожидали
use strict;
use warnings;
package Information;
our $VERSION_NO = 9.99;
package Main;
use Wx qw/ :sizer :colour /;
use parent 'Wx::App';
sub OnInit {
my $frame = Wx::Frame->new(undef, -1, "SimpleCalc $Information::VERSION_NO");
my $centerPanel = Wx::Panel->new($frame);
$centerPanel->SetBackgroundColour(wxRED);
my $frameSizer = Wx::BoxSizer->new(wxHORIZONTAL);
$frameSizer->Add($centerPanel, 1, wxEXPAND);
$frame->SetSizer($frameSizer);
$frame->Center;
$frame->Show;
return 1;
}
my $app = Main->new;
$app->MainLoop;
выход