我尝试使用类似表格的视图显示存储在数组中的一些数据。 为此,我循环遍历数组并将相关数据检索到标签中,然后将其用作“表格单元格”。 每个“表行”都以
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"
小部件的实际尺寸可通过
winfo width
和 winfo height
获得,但这些尺寸在小部件创建后立即设置为虚拟值,并且只有在小部件自行绘制后才变得正确。 (从技术上讲,这是在最后一个 <Configure>
事件在第一个 <Map>
事件之前传递之后。)在此之前,您只能有用地使用 winfo reqwidth
/winfo reqheight
来获取 requested 宽度和高度;在窗口管理器和嵌套几何管理器完成谈判之前,这就是您真正知道的全部内容。小部件可能获得比其要求的更多或更少的空间,并且两个维度大多是独立的(当然,尽管某些布局可能会减少这种情况)。