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 рассчитать геометрию.

Другие вопросы по тегам