2013-11-22 94 views
2

我寫了一個與我們的psql數據庫交互的GUI。對於給定的日期,gui將顯示具有各種標識符和信息位的人員列表。我使用Tk :: Table來顯示數據PerlTk標籤 - 同一個部件中的不同顏色文本

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」爲「First Name」着色?

回答

2

通過在帶有字符串參數的Tk::Table上使用->put方法,創建了一個簡單的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來計算幾何。

相關問題