PerlTk Label - другой цвет текста в одном виджете
Я написал графический интерфейс, который взаимодействует с нашей базой данных PSQL. Для данной даты графический интерфейс отображает список людей с различными идентификаторами и битами информации. Я использую Tk::Table для отображения данных
eg
my $f_mainframe = $mw -> Frame(-bg=>'white');
$f_mainframe -> pack(-side=>'top', -expand=>1, -fill=>'both');
my $itable = $f_mainframe -> Table(-rows => 13,
-columns=>30,
-fixedrows => 1,
-fixedcolumns => 1,
-relief => 'raised') -> pack();
$itable->put(1,$firstnamecol,"First Name\nMYO");
Можно ли покрасить "Имя" в черный и "MYO" в красный?
1 ответ
Используя ->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
заставить ту же геометрию, что и эквивалентный виджет метки. Может быть, вы в порядке с жестким кодом -width
а также -height
вместо. Другим решением может быть использование bbox()
метод Tk::Text
/Tk::ROText
рассчитать геометрию.