我正在尝试在"块";并从右到左组织这些块,以显示圣经诗句和原始希伯来语的语际视图。一般来说,这是每个原始单词一个块,如下面显示的两个这样的块。
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
如果你愿意的话,你可以在一系列字符上显示很多标签;有一个优先级系统,其实际应用的属性是来自指定它的最高优先级标签的属性(或者如果没有其他内容,则来自整个小部件的配置属性(。