Почему мой Perl / Tk Scrolled на самом деле не прокручивается? - PullRequest
2 голосов
/ 03 июня 2009

Следующий код выдает в основном то, что я хочу, но прокручиваемая панель слева не прокручивается. Я использую ActivePerl 5.8.9 Build 825:

Код:

use Tk;
use Tk::Pane;
use Tk::LabFrame;

# create the application window
my $MW = MainWindow->new ( -background => "GREY" );

# set the x/y size for the window
$MW->geometry("800x600");

# add a window title
$MW->title("Monitor Boxes");

# Disallow window resizing
$MW->resizable(0,0);

# create a labelled frame on the window to house the list of buttons to be pressed
$boxListFrame = &create_framed_section( "List Of Boxes", 
                    "acrosstop", 
                    5, 
                    5, 
                    170, 
                    565,
                    "BLUE", 
                    "GREY");

# create a labelled frame on the window to house the information to be displayed 
# when a particular button is pressed
$statusOfBoxFrame = &create_framed_section( "Status", 
                        "acrosstop", 
                        185, 
                        5, 
                        600, 
                        565, 
                        "BLUE", 
                        "GREY");

# create a scrollable pane in the left hand pane so that if more buttons than 
# is able to be displayed are put onto the application the scroll bar will allow 
# the ones not displayed to be access
my $pane = $MW->Scrolled(   'Pane', 
                -scrollbars => 'e', 
                -width => 140, 
                -height => 555, 
                -background => "GREY")->place(-x=>15,-y=>25);

# setup the array of buttons
@boxes = ("BUTTON1", "BUTTON2", "BUTTON3", "BUTTON4", "BUTTON5", "BUTTON6", "BUTTON7", "BUTTON8", "BUTTON9", "BUTTON10", "BUTTON11", "BUTTON12", "BUTTON13", "BUTTON14", "BUTTON15", "BUTTON16");

# put the buttons onto the scrollable pane in the frame on the window (LOL)
DisplayCheckButtons( $pane, @boxes);

# wait until the user exits the app
MainLoop;

# exit the app
exit 0;

sub DisplayCheckButtons 
{
    my ( $parent, @names ) = @_;
    $Frame->destroy if $Frame;
    $Frame = $parent->Frame(    -width => 160, 
                    -height => 555, 
                    -background => "GREY")->place(-x=>15,-y=>15);

    $xpos = 5;
    $ypos = 5;

    foreach $box (@names)
    {
        $buttons->{$box} = $Frame->Button(-text => $box)->place(-x=>$xpos,-y=>$ypos);

        $ypos = $ypos + 40;

    }
}

sub create_framed_section
{
    # get the parameters
    my($label, $labelside, $posX, $posY, $width, $height, $fontColour, $backgroundColour) = @_;

    # create the item in the desired position with supplied information
    $frame = $MW->LabFrame( -label      => $label,
                -labelside  => $labelside,
                -width      => $width,
                -height     => $height,
                -foreground => $fontColour,
                -background => $backgroundColour,
                )->place(-x=>$posX,-y=>$posY);

    return $frame;
}

Я надеюсь, что кто-то может указать на незначительную вещь, которую я упустил из этого, и положить конец моему разочарованию.

Ответы [ 2 ]

3 голосов
/ 03 июня 2009

У вас две проблемы. Во-первых, вы должны использовать виджет Pane напрямую, а не создавать внутри него другой Frame. Другая проблема заключается в использовании диспетчера геометрии place внутри виджета Pane. Попробуйте вместо этого использовать pack.

$buttons->{$box} = $parent->Button(-text => $box)->pack(-pady => 10);

С этим, пожалуйста, узнайте, как использовать прагмы strict и warnings. Они неоценимы, помогая вам писать хороший код. Как указывал Синан, не используйте нотацию &foo() для вызова подпрограмм. Это (очень) старый синтаксис. Это не обязательно и потенциально вредно. Наконец, я бы рекомендовал использовать pack или grid вместо place для Perl / Tk. Как правило, легче получить желаемое поведение. Используйте place только тогда, когда вам нужно абсолютное позиционирование. Вы даже можете смешивать и сочетать менеджеры геометрии, если они управляют разными кадрами.

2 голосов
/ 03 июня 2009

Сначала несколько замечаний: ваш код не является строго безопасным, что затрудняет отладку. Вы также не вызываете пакет ни на одном из ваших виджетов. Вы не должны использовать амперсанд перед именем, если вызываете подпрограммы, если вы не знаете их эффекты и не хотите их видеть - см. perldoc perlsub .

Ширина трех панелей в сумме превышает 800. Желаемая компоновка не так ясна.

Теперь вот код ( украденный из PerlMongers ), который создает прокручиваемую панель с кучей кнопок:

#!/usr/bin/perl

use strict;
use warnings;

use Tk;
use Tk::Pane;

my $top = MainWindow->new;
$top->Label(-text => "Enter the scroll frame")->pack;

my $frame = $top->Scrolled(
    'Frame',
    -scrollbars => "e",
)->pack;

$frame->Button(-text => "BUTTON $_")->pack for ( 1 .. 16 );

MainLoop;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...