2

下面的代码Perl/Tk从 hash 中创建了填充每个事件详细信息的按钮%events。有没有办法格式化按钮内的文本,以便它以 printf 在第 16 行打印出来的方式出现在对齐的列中。

use strict;
use Tk;

my %events;
$events{"Jazz Fest"}{city}   = "New Orleans";
$events{"Jazz Fest"}{state}   = "LA";
$events{"Jazz Fest"}{date}   = "June 6th, 2023";
$events{"Lollapalooza"}{city}   = "Chicago";
$events{"Lollapalooza"}{state}   = "IL";
$events{"Lollapalooza"}{date}   = "July 25th, 2023";
$events{"Blues Fest"}{city}   = "Chicago";
$events{"Blues Fest"}{state}   = "IL";
$events{"Blues Fest"}{date}   = "Augsut 4th, 2023";

my %data;
foreach my $event (sort keys %events) {

    printf("%-15.15s %-20.20s %-2.2s %18.18s\n", $event, $events{$event}{city}, $events{$event}{state}, $events{$event}{date});
    $data{$event} = sprintf("%-15.15s %-20.20s %-2.2s %18.18s", $event, $events{$event}{city}, $events{$event}{state}, $events{$event}{date});
    
}

my $data;

my $mw = MainWindow->new;
$mw->title("Event Clipboard Copy");
$mw->label("Pick Event Details to Copy.");

for(sort keys %data){

    my $text = $data{$_};
    $mw->Button( -text => $text, -anchor => 'w', -command => sub  {
    
    Clipboard->copy( $text );
         
        }
    )->pack( -fill => 'x' );
}

MainLoop;
4

1 回答 1

2

要对齐列,请将每个按钮的字体设置为“Courier”(或其他等宽字体)。至少有两种方法可以做到这一点:

  1. 创建按钮时
  2. 将按钮分配给变量,然后调用configure它。
#Setting font when creating the button
$mw->Button( -text => $text, -anchor => 'w', -font => [-family => 'Courier'], -command => sub {
#Calling configure on the button
my $button = $mw->Button(-text => $text, -anchor => 'w', -command => sub {
...
}->pack( -fill => 'x' );
$button->configure(-font => [-family => 'Courier']);

这是字体设置为 Courier 时的外观 字体设置为 Courier 的对话框

并且没有设置字体:

未对齐的列

于 2022-03-05T20:16:23.547 回答