如何获取要在Tkx标签中使用的字符串的“宽度”
我正在使用Perl Tkx创建一个简单的应用程序,并允许用户选择一个目录.而不是使用文本包装或将框拉伸到荒谬的长度来显示整个目录名称,如果名称太长,我想截断它并将“…”追加到最后.
问题是标签的宽度被定义为某个任意值(如40).如果这个值是标签可以容纳多少个字符的度量,我可以将字符串截断为37并附加“…”,但似乎并非如此. 有谁知道使用Perl Tkx的标签的宽度实际上是一个衡量标准?如何找到我的字符串将占用的宽度单位数量,以便我可以找出截断它的适当点的位置? 编辑: 我在tcl manual中找到了这个答案:
这应该意味着对于40的宽度来截断文本我应该只需要将字符串截断为37个字符并添加“…”. 我通过用所有“M”填充标签来测试这一点.我使用字母“M”,因为它通常是最宽的字符(see here).我编写的代码截断为37“M”并在末尾添加“…”,但“M”似乎在大约24“M”之后溢出标签的末尾. 这意味着假设它只是拉伸标签以适应最宽的角色40这是不安全的…因此我的问题仍然没有答案. 如何确定字符串的“宽度”,以便我可以适当地截断它? EDIT2: 我找到了一个解决方法,但它仍然不是我想要的解决方案.如果将标签上的文本更改为固定宽度字体,它将正常工作.它看起来不太好看,所以我真的很喜欢适用于非固定宽度字体的解决方案. 解决方法
当文档说标签的-width被解释为多个字符时,它可能使用字符的平均宽度而不是最大宽度.正如您所发现的,当使用固定宽度的字体时,您可以使用字符,一切都会很好.当使用可变宽度字体时,事情变得很困难,因为字符和像素之间没有固定的关系.
您需要以一致的单位(即像素)工作并缩短文本直到它适合 – 最好有一个良好的初始猜测,以保持您的代码快速.您可以通过winfo reqwidth获取标签宽度(以像素为单位),使用字体测量获得以像素为单位的文本宽度(对于特定字体). use strict; use warnings; use Tkx; Tkx::package_require('tile'); my $text; my $mw = Tkx::widget->new('.'); my $label = $mw->new_ttk__label(-width => 10,-textvariable => $text); Tkx::pack($label,-side => 'left'); $text = limit_text($label,'abcdefghijklmnopqrstuvwxyz'); Tkx::MainLoop; sub limit_text { my $label = shift; my $text = shift; my $font = $label->cget('-font') || 'TkDefaultFont'; my $label_width = $label->g_winfo_reqwidth; my $text_width = Tkx::font_measure($font,$text); my $i = int length($text) * ($label_width / $text_width); while ($text_width > $label_width) { $text = substr($text,--$i) . '...'; $text_width = Tkx::font_measure($font,$text); } return $text; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |