2013-11-22 3 views
2

Я написал графический интерфейс, который взаимодействует с нашей базой данных psql. В течение заданной даты gui отображает список лиц с различными идентификаторами и битами информации. Я использую Tk :: таблицы для отображения данныхPerlTk Label - Разный цветной текст в том же виджете

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"); 

Можно ли цвет «First Name» в черном и «MYO» в красном?

ответ

2

Используя метод ->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 для расчета геометрии.