如何在块中构建堆叠的文本行:文本小部件还是画布

  • 本文关键字:文本 小部 构建 tcl tk-toolkit
  • 更新时间 :
  • 英文 :


我正在尝试在"块";并从右到左组织这些块,以显示圣经诗句和原始希伯来语的语际视图。一般来说,这是每个原始单词一个块,如下面显示的两个这样的块。

H1254               H7225
bā·rā           bə·rê·šîṯ
בְּרֵאשִׁ֖ית              בָּרָ֣א  
created    In the beginning
V‑Qal‑Perf‑3ms       Prep‑b | N‑fs 

我很困惑如何处理这个问题,或者它应该在文本小部件或画布中完成?每行文本都将具有不同的字体和标记,并且这些标记具有不同的绑定。

由于字体不同,使用画布并分别绘制每个单词的正确方法是什么?我假设画布宽度可以是固定的,然后确定每个块中最大文本行的宽度,以确定每行可以容纳多少块。

也许我在这里很愚蠢,这并没有那么难。我唯一的GUI体验是使用box模型,而flex box使这变得非常容易;所以,我认为Tk也能做到这一点,我只是没有看到。

谢谢。

您可以使用其中任何一个来完成此操作。显然,使用画布,您可以将文本放置在任何您想要的位置(使用文本项的边界框来帮助您确定位置(,但这在某种程度上是您自己完成的。

如果你使用文本小部件,你需要设置合适的选项卡和标签。特别是,设置选项卡,使文本按照您希望的方式对齐。选项卡设置默认为经典的"每8个字符"样式,但您应该使用以下内容:

.t configure -tabs {5c right}

这样你就可以插入这样的文本(注意:我根本不读希伯来语,所以我真的不能告诉你那一行是否正确(:

set dataSource {
H1254               H7225
bā·rā           bə·rê·šîṯ
בְּרֵאשִׁ֖ית              בָּרָ֣א  
created    {In the beginning}
V‑Qal‑Perf‑3ms       {Prep‑b | N‑fs}
}
# You've got a better data source than a literal list, but it's good for testing
set aWidth 0
set bWidth 0
set font [.t cget -font]
foreach {a b} $dataSource {
set aWidth [expr {max($aWidth, [font measure $font $a])}]
set bWidth [expr {max($bWidth, [font measure $font $b])}]
.t insert end t$at$bn
}
.t configure -tabs [list [expr {$aWidth + 10}] right [expr {$aWidth + $bWidth + 20}] right]

请注意,我已经集成了测量文本(使用font measure(,以便根据数据计算选项卡位置。(10和20只是一点额外的空间,这样你就可以看到发生了什么。(

使用标记可以将样式应用于文本范围,例如不同的字体,或者使文本能够响应单击。

set tagName "Title"
.t tag configure $tagName -font {Arial 18 bold} -foreground red
.t tag bind $tagName <1> {puts "Clicked on title"}
.t tag add $tagName 1.0 1.end
# You can also apply tags when inserting
# .t insert end "Example" $tagName

如果你愿意的话,你可以在一系列字符上显示很多标签;有一个优先级系统,其实际应用的属性是来自指定它的最高优先级标签的属性(或者如果没有其他内容,则来自整个小部件的配置属性(。

最新更新