获取标签tcl/tk小部件的实际尺寸

问题描述 投票:0回答:1

我尝试使用类似表格的视图显示存储在数组中的一些数据。 为此,我循环遍历数组并将相关数据检索到标签中,然后将其用作“表格单元格”。 每个“表行”都以

frame
的形式运行。 现在我需要使某些“列”的“单元格”具有相同的宽度。 这个想法是检索列中最宽“单元格”的宽度并将其应用于那里的所有其他“单元格”。 要显示的数据量高达数千行,因此我不担心性能问题(尽管如果可能的话,我很高兴看到更好的解决方案)。 问题是如何得到每个
label
的实际宽度? 使用
cget
选项返回“0”。 人工预测最大宽度不是一个选项:( 下面是简化的代码:

set cnt 0;
set maxWidth 0;
set labelDesign {-borderwidth 1 -relief solid -background white -justify left};
set btnDesign {-state normal -relief solid -background gray};
    
foreach {rName rData} [array get SourceArray] { 
        eval frame .row_${cnt};
        eval label .row_${cnt}.rName    {*}$labelDesign -text $rName;
        eval label .row_${cnt}.rData    {*}$labelDesign -text $rData;

        grid .row_${cnt}.rName  -row $cnt -column 0;
        grid .row_${cnt}.rData  -row $cnt -column 1;

        pack .row_${cnt} -in .ParentFrame -fill x; 

        if {[.row_${cnt}.rName cget -width] > $maxWidth} {set maxWidth [.row_${cnt}.rName cget -width]}
    
        incr cnt 1;
}

# Run "for" loop to further apply the $maxWidth value to all the labels in the "column"
tcl tk-toolkit
1个回答
0
投票

小部件的实际尺寸可通过

winfo width
winfo height
获得,但这些尺寸在小部件创建后立即设置为虚拟值,并且只有在小部件自行绘制后才变得正确。 (从技术上讲,这是在最后一个
<Configure>
事件在第一个
<Map>
事件之前传递之后。)在此之前,您只能有用地使用
winfo reqwidth
/
winfo reqheight
来获取 requested 宽度和高度;在窗口管理器和嵌套几何管理器完成谈判之前,这就是您真正知道的全部内容。小部件可能获得比其要求的更多或更少的空间,并且两个维度大多是独立的(当然,尽管某些布局可能会减少这种情况)。

© www.soinside.com 2019 - 2024. All rights reserved.