Tkinter 标签的优先级

Posted

技术标签:

【中文标题】Tkinter 标签的优先级【英文标题】:Priority of Tkinter tags 【发布时间】:2020-03-26 13:43:30 【问题描述】:

我知道这是重复的,但另一个问题没有有效答案,而且有点令人困惑

当您将标签添加到 tkinter 文本小部件时,第一个标签将获得优先权。如果最近添加的标签优先,我会更喜欢它。在我的最小可重现示例中:

import tkinter as tk

win = tk.Tk()

txt = tk.Text(win)
txt.grid(row=0, column=0)

txt.insert('1.1', 'Hello Very Worldy World!')

txt.tag_add('tagone', '1.2', '1.4')
txt.tag_config('tagone', foreground='yellow')

txt.tag_add('tagtwo', '1.7', '1.13')
txt.tag_config('tagtwo', foreground='purple')

txt.tag_add('tagone', '1.6', '1.14')
txt.tag_config('tagone', foreground='yellow')

tk.mainloop()

如果你运行它,你会看到紫色标签进入前景,而不是黄色标签。有没有办法根据时间顺序来定义标签优先级,而不是现在使用的?

【问题讨论】:

如果你说I know this is a duplicate,指定你认为它是/可以是重复的问题是有用的。这样可以更轻松地评估声明 did not have a valid answer, and was kind of confusing 【参考方案1】:

标签的优先级是基于标签的创建时间,而不是标签的应用时间。

来自effbot:

如果您将多个标签附加到一系列文本,则最近创建的标签中的样式选项会覆盖早期标签中的选项。在以下示例中,生成的文本是黄色背景上的蓝色。

text.tag_config("n", background="yellow", foreground="red")
text.tag_config("a", foreground="blue")
text.insert(contents, ("n", "a"))

请注意,将标签附加到范围的顺序无关紧要;重要的是标签创建顺序。

您可以使用tag_raisetag_lower 更改标签优先级。如果在上面的示例中添加text.tag_lower("a"),则文本变为红色。

因为您在tagtwo 之前创建了tagone,所以tagtwo 获得优先权。您可以通过为第三个范围指定新名称 (tagthree)、在创建 tagone 之前创建 tagtwo 或使用 txt.tag_lower('tagtwo')/txt.tag_raise('tagone') 来获得预期的行为。

【讨论】:

以上是关于Tkinter 标签的优先级的主要内容,如果未能解决你的问题,请参考以下文章

IDClass和标签选择器优先级

CSS样式优先级

html样式优先级

属性优先级图片属性设置内联标签设置大小

Android资源标签属性及优先级(一)

20161108