首页 > 解决方案 > 在 Tkinter 文本中设置标签 - 尽管有进一步的变化,标签的范围始终从 1.1 开始

问题描述

在我的 Tkinter GUI 中,我尝试创建一个功能,用户可以在其中逐字重写条目小部件中的给定文本。文字的颜色应根据文字是否正确书写而改变。问题是我创建的标签范围总是以 1.1 开头,即使我将开头设置为每个单词中第一个字母的位置。“例如,文本中的第二个单词从字符串中的第 10 位开始,在我使用空格键两次之后:text.tag_ranges(tag_name)返回(<string object: '1.1'>, <string object: '1.15'>),但是当我print(start)得到我期望的结果时:1.10”。结果是着色总是从文本的开头开始,而不是单词的开头。结局总是好的。有什么我看不到的地方吗?

import tkinter as tk
import re

t = "quae ab illo inventore veritatis et quasi"
text_split = t.split()
last_char = len(t)
whitespaces_list = [0] + [i.start() for i in re.finditer(" ", t)] + [last_char]

window = tk.Tk()
window.geometry('750x600')

n = 0


def next_word(event):
    global n
    n = n + 1
    z = text_split[n - 1]
    correct_word = re.search(z, entry.get())

    if n < len(whitespaces_list):
        start = '1.' + str(whitespaces_list[n - 1])
        end = '1.' + str(whitespaces_list[n])
        for x in range(len(text_split) - 1):
            text.tag_add(str(x), start, end)
        # print(text.tag_ranges(str(x)))
        # print(start)
        # print(end)
        if correct_word:
            text.tag_config(str(x), foreground="green")
        else:
            text.tag_config(str(x), foreground="red")

    entry.delete(0, tk.END)


label1 = tk.Label(width=200, height=10)
label1.pack()

text = tk.Text(label1)
text.place(x=40, y=20)
text.insert(tk.INSERT, t)

label2 = tk.Label(height=80, width=200)
label2.pack()

entry = tk.Entry(label2)
entry.place(x=300, y=20)

window.bind("<space>", next_word)
window.mainloop()

标签: pythontkinter

解决方案


最后我找到了一个非常简单的解决方案,我错误地设置了循环,它应该被删除并且正确的代码部分是:

if n < len(whitespaces_list):
    start = '1.' + str(whitespaces_list[n - 1])
    end = '1.' + str(whitespaces_list[n])
text.tag_add(str(n), start, end)
if correct_word:
    text.tag_config(str(n), foreground="green")
else:
    text.tag_config(str(n), foreground="red")

感谢 Derek 和 Matiiss 的回复。


推荐阅读