Responding to Tk Resize Events
Problem
You’ve written a Tk program, but your widget layout goes awry when the user resizes their window.
Solution
You can prevent the user from resizing the window by intercepting the Configure event:
use Tk;
$main = MainWindow->new();
$main->bind('<Configure>' => sub {
$xe = $main->XEvent;
$main->maxsize($xe->w, $xe->h);
$main->minsize($xe->w, $xe->h);
});Or you can use pack to control how each widget
resizes and expands when the user resizes its container:
$widget->pack( -fill => "both", -expand => 1 ); $widget->pack( -fill => "x", -expand => 1 );
Discussion
By default, packed widgets resize if their container changes size —they don’t scale themselves or their contents to the new size. This can lead to empty space between widgets, or cropped or cramped widgets if the user resizes the window.
One solution is to prevent resizing. We bind to
the <Configure> event, which is sent when a
widget’s size or position changes, registering a callback to
reset the window’s size. This is how you’d ensure a popup
error-message box couldn’t be resized.
You often want to let the user resize the application’s
windows. You must then define how each widget will react. Do this
through the arguments to the pack method:
-fill controls the dimensions the widget will
resize in, and -expand controls whether the
widget’s size will change to match available space. The
-expand option takes a Boolean value, true or
false. The -fill option takes a string indicating the dimensions ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access