Используя метод ->put
на Tk::Table
с аргументом строки, создается простой виджет Tk::Label
. Ярлыки могут быть настроены только на один цвет переднего плана. Для достижения того, что вы хотите, вы можете использовать Tk::ROText
(текстовый виджет только для чтения). Следующий код отображает виджет метки и текстовый виджет, но последний с различными цветами:
use strict;
use Tk;
use Tk::ROText;
my $mw = tkinit;
# The monocolored Label variant
my $l = $mw->Label
(
-text => "First Name\nMYO",
-font => "{sans serif} 12",
)->pack;
# The multicolored ROText variant
my $txt = $mw->ROText
(
-borderwidth => 0, -highlightthickness => 0, # remove extra borders
-takefocus => 0, # make widget unfocusable
-font => "{sans serif} 12",
)->pack;
$txt->tagConfigure
(
'blue',
-foreground => "blue",
-justify => 'center', # to get same behavior as with Tk::Label
);
$txt->tagConfigure
(
'red',
-foreground => "red",
-justify => 'center', # to get same behavior as with Tk::Label
);
$txt->insert("end", "First Name\n", "blue", "MYO", "red");
# a hack to make the ROText geometry the same as the Label geometry
$txt->GeometryRequest($l->reqwidth, $l->reqheight);
MainLoop;
Как вы видите, это гораздо больше, набрав, чтобы получить текст виджета вариант работать. Поэтому, вероятно, полезно отрисовать этот код в подпрограмме или классе виджета (возможно, что-то для CPAN?). Обратите также внимание, что вам приходится иметь дело с геометрией виджета самостоятельно. Этикетка автоматически расширяется для размещения содержимого этикетки. Текстовый виджет по умолчанию имеет геометрию 80x24 символов и не сжимается и не расширяется автоматически в зависимости от его содержимого. В образце я использовал взломать с помощью GeometryRequest
, чтобы заставить ту же геометрию, что и виджет эквивалентной метки. Возможно, вы в порядке с hardcoding -width
и -height
. Другим решением может быть использование метода bbox()
Tk::Text
/Tk::ROText
для расчета геометрии.