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 ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.