You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl Tk新手求助:复选框列表分栏与控件对齐优化方案

Hey there! Let's fix your Perl Tk checkbox layout issues so it looks clean and organized. I'll cover both splitting into multiple columns and aligning the text/checkboxes properly.

Solution Overview

We'll use Grid layout (more flexible for multi-column arrangements) instead of pack for the checkboxes, and adjust the Checkbutton settings to get the text left-aligned and checkboxes right-aligned.

Modified Code
#!/usr/bin/perl
use Tk;

$main = MainWindow->new();
$main->title("Presence Check");

# Main label
$label = $main->Label(-text => "Presence Check", -font => ['Helvetica', 12, 'bold']);
$label->pack(-pady => 10);

# Main frame for checkboxes with grid layout
$frame = $main->Frame(-relief=>"groove", -borderwidth=>2);
$frame->pack(-fill => 'both', -expand => 1, -padx => 10, -pady => 10);

# Configure grid columns: make column 0 expandable, column 1 fixed
$frame->gridColumnconfigure(0, -weight => 1);
$frame->gridColumnconfigure(1, -weight => 0);

# Create checkboxes with proper alignment and grid placement
# Column 0 (first column)
$check1 = $frame->Checkbutton(
    -text=>"Document A (docx, pdf)", 
    -variable=>\$a, 
    -onvalue=>"APRESENT", 
    -offvalue=>"AABSENT",
    -labelanchor => 'w',  # Text on left, checkbox on right
    -justify => 'left'    # Left-align multi-line text if needed
);
$check1->grid(-row => 0, -column => 0, -sticky => 'ew', -padx => 5, -pady => 3);

$check2 = $frame->Checkbutton(
    -text=>"Document B (xlsx)", 
    -variable=>\$b, 
    -onvalue=>"BPRESENT", 
    -offvalue=>"BABSENT",
    -labelanchor => 'w',
    -justify => 'left'
);
$check2->grid(-row => 1, -column => 0, -sticky => 'ew', -padx => 5, -pady => 3);

$check3 = $frame->Checkbutton(
    -text=>"C specification", 
    -variable=>\$c, 
    -onvalue=>"CPRESENT", 
    -offvalue=>"CABSENT",
    -labelanchor => 'w',
    -justify => 'left'
);
$check3->grid(-row => 2, -column => 0, -sticky => 'ew', -padx => 5, -pady => 3);

$check4 = $frame->Checkbutton(
    -text=>"A-Specification", 
    -variable=>\$aspec, 
    -onvalue=>"ASPECPRESENT", 
    -offvalue=>"ASPECSABSENT",
    -labelanchor => 'w',
    -justify => 'left'
);
$check4->grid(-row => 3, -column => 0, -sticky => 'ew', -padx => 5, -pady => 3);

$check5 = $frame->Checkbutton(
    -text=>"Important Report", 
    -variable=>\$report, 
    -onvalue=>"REPORTPRESENT", 
    -offvalue=>"REPORTSABSENT",
    -labelanchor => 'w',
    -justify => 'left'
);
$check5->grid(-row => 4, -column => 0, -sticky => 'ew', -padx => 5, -pady => 3);

# Column 1 (second column)
$check6 = $frame->Checkbutton(
    -text=>"Handbook", 
    -variable=>\$handbook, 
    -onvalue=>"HANDBOOKPRESENT", 
    -offvalue=>"HANDBOOKABSENT",
    -labelanchor => 'w',
    -justify => 'left'
);
$check6->grid(-row => 0, -column => 1, -sticky => 'ew', -padx => 5, -pady => 3);

$check7 = $frame->Checkbutton(
    -text=>"Data Spreadsheet", 
    -variable=>\$dataxls, 
    -onvalue=>"DATAPRESENT", 
    -offvalue=>"DATAABSENT",
    -labelanchor => 'w',
    -justify => 'left'
);
$check7->grid(-row => 1, -column => 1, -sticky => 'ew', -padx => 5, -pady => 3);

$check8 = $frame->Checkbutton(
    -text=>"D file", 
    -variable=>\$dfile, 
    -onvalue=>"DFILEPRESENT", 
    -offvalue=>"DFILEABSENT",
    -labelanchor => 'w',
    -justify => 'left'
);
$check8->grid(-row => 2, -column => 1, -sticky => 'ew', -padx => 5, -pady => 3);

$check10 = $frame->Checkbutton(
    -text=>"xx doc", 
    -variable=>\$xxdoc, 
    -onvalue=>"XXDOCPRESENT", 
    -offvalue=>"XXDOCABSENT",
    -labelanchor => 'w',
    -justify => 'left'
);
$check10->grid(-row => 3, -column => 1, -sticky => 'ew', -padx => 5, -pady => 3);

$check18 = $frame->Checkbutton(
    -text=>"yy Doc", 
    -variable=>\$yydoc, 
    -onvalue=>"YYDOCPRESENT", 
    -offvalue=>"YYDOCABSENT",
    -labelanchor => 'w',
    -justify => 'left'
);
$check18->grid(-row => 4, -column => 1, -sticky => 'ew', -padx => 5, -pady => 3);

# Exit button
$button = $main->Button(-text => "Exit", -command => \&exit_button);
$button->pack(-pady => 10);

MainLoop();

sub exit_button {
    print join(' ', $a, $b, $c, $aspec, $report, $handbook, $dataxls, $dfile, $xxdoc, $yydoc) . "\n";
    exit;
}
Key Changes Explained

1. Multi-Column Layout with Grid

  • We replaced pack with grid for the checkboxes, which lets us place each widget in a specific row/column position.
  • $frame->gridColumnconfigure(0, -weight => 1) makes the first column expand to fill available space, while column 1 stays fixed (so checkboxes in both columns align neatly).
  • We split the 10 checkboxes into two columns: first 5 in column 0, next 5 in column 1, matching rows between columns.

2. Text Left-Align & Checkbox Right-Align

  • -labelanchor => 'w': This positions the text to the west (left) of the checkbox indicator, so text is on the left and the checkbox is on the right for each entry.
  • -justify => 'left': Ensures that if any text wraps to multiple lines, it stays left-aligned.
  • -sticky => 'ew': Makes each checkbox widget expand horizontally to fill its grid cell, so the text stays left-aligned and the checkbox stays anchored to the right of the cell.

3. Extra Polish

  • Added window title with $main->title() for better usability.
  • Added padding (-padx, -pady) around widgets to avoid cramped spacing.
  • Used join() in the exit subroutine for cleaner output formatting.

内容的提问来源于stack exchange,提问作者Blurman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:47:54