2011-09-19 28 views

回答

1

據我所知,標準ListBox窗口小部件只支持字符串作爲內容的一行。 不要沮喪,因爲我們可以輕鬆構建一個更強大的列表框,它可以包含小部件!

下面是我爲程序編寫的一些代碼。其結果是如下所示的照片(我畫了,所以我把它直接從相關文檔) enter image description here

的TIPS:
- 我寫的代碼是用Perl使用Tcl :: Tk模塊,所以你可以很容易地將它改爲Perl/Tk
- 如圖所示,6個小部件構建一個數組@item,並且6個@item數組構建一個數組@cur_items,並且您可以從@cur_items開始查找任何小部件在這個列表中(因爲你已經知道序列)
- 我使用額外的幀來使這些小部件整齊,如果你只想組織兩個小部件,你可以忽略它們(但我建議使用幀)
- 請igno再小部件的名稱,如subsubwidget或subsubdate,這是很難編碼給在重編程的壓力:)

# init - create six items 
# each of them contains 5 widgets 
for (1..6) { 
    my @items =(); 

    # create a frame for each item 
    # 0 --- LabelFrame --- file name 
    # 1 --- label --- icon 
    # 2 --- text --- path dir 
    # 3 --- label --- date 
    # 4 --- label --- size 
    # 5 --- button --- preview info 
    my $item = $toplevel->Frame(
     -bg => 'white', 
    )->pack(
     -in => $toplevel, 
     -anchor => 'nw', 
     -pady => 10, 
    ); 
    my $widget = $item->LabelFrame(
     -bg => 'white', 
     -fg => 'blue', 
    )->pack(
     -in => $item, 
     -side => 'left', 
     -anchor => 'nw', 
    ); 
    push (@items, $widget); 
    # file/dire type icon 
    my $subicon = $widget->Label(
     -bg => 'white', 
    ); 
    $subicon->pack(
     -in => $widget, 
     -side => 'left', 
     -anchor => 'center' 
    ); 
    push (@items, $subicon); 
    my $subwidget = $widget->Frame(
     -bg => 'white', 
    )->pack(
     -in => $widget, 
     -side => 'left', 
    ); 
    # file path 
    my $subtext = $subwidget->Text(
     -height => 2, 
     -width => 39, 
     -bg => 'white', 
     -borderwidth => 0, 
     -wrap => 'char', 
    )->pack(
     -in => $subwidget, 
     -anchor => 'nw', 
    ); 
    push (@items, $subtext); 
    $subtext->configure(-state => 'disabled'); 
    # date and size 
    my $subsubwidget = $subwidget->Frame(
     -bg => 'white', 
    )->pack(
     -in => $subwidget, 
     -anchor => 'nw', 
    ); 
    my $subsubdate = $subsubwidget->Label(
     -bg => 'white', 
     -text => '', 
    )->pack(
     -in => $subsubwidget, 
     -anchor => 'nw', 
     -side => 'left', 
    ); 
    push (@items, $subsubdate); 
    my $subsubsize = $subsubwidget->Label(
     -width => 12, 
     -bg => 'white', 
    )->pack(
     -in => $subsubwidget, 
     -anchor => 'nw', 
     -side => 'left', 
    ); 
    push (@items, $subsubsize); 
    # more info 
    my $infobtn = $item->Button(
     -text => '>', 
     -width => 0, 
     -height => 4, 
     -padx => 0, 
     -pady => 0, 
     -relief => 'flat', 
     -bg => 'white', 
    )->pack(
     -in => $item, 
     -side => 'left', 
     -anchor => 's', 
    ); 
    push (@items, $infobtn); 

    # record created widget 
    push (@cur_items, \@items); 
} 
# end of init