You need to change your gridColumnconfigure and gridRowconfigures to use the '-minsize' attribute. '-weight' just controls how the cells respond to the grid being resized. As an example:
for (my $i = 0; $i < $rows; $i++) {
$tl->gridRowconfigure($i, -weight => 1, -minsize => 80);
}
would make your cells always at least 80 pixels wide. All you have to do is make sure that minsize is greather than or equal to the largest widget.
I have used this (many times!) in TCL/Tk, but not in Perl/Tk. However, I can't see why it wouldn't work.