首页 > 解决方案 > tkinter:使用标签突出显示文本的取消突出显示

问题描述

我是 tkinter 的新手,我想使用 tkinter 标签实现文本的突出显示和取消突出显示。我尝试了 tag_remove()方法,但在我的情况下这是错误的,所以我想以这种方式实现突出显示和取消突出显示。我希望在我按键盘上的“a”时突出显示文本,在按“x”时取消突出显示,并在按“a”时再次突出显示。有什么方法可以设置标签的优先级以实现我的目标?任何帮助将不胜感激。提前致谢!

from tkinter import *
import tkinter as tk
from tkinter import Frame, Menu
from tkinter import ttk 

class AnnotationTool(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master) 

        self.tagA='INGREDIENT'
        self.keyA='a'
        self.results_field = Text(self)
     
        self.results_field.config(height=20,spacing1=5,wrap='word',undo=True)
        self.results_field.grid(pady=10,column=3,row=3,padx=10,rowspan=12)
        self.results_field.insert('insert','abc def ghi')

        self.results_field.focus() 
        self.results_field.tag_configure(self.tagA, background="yellow")
        self.results_field.tag_configure('hide', background="white")

        self.results_field.bind(self.keyA, self.onKeyPressA)
        self.results_field.bind('x', self.onKeyPressX)


    def onKeyPressA(self,event):
        self.results_field.tag_add(self.tagA, 'sel.first', 'sel.last')
        return "break"

    def onKeyPressX(self,event):
        self.results_field.tag_add('hide','sel.first', 'sel.last')
        return "break"
                    


class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(AnnotationTool)
        self.title('App')

    def switch_frame(self, frame_class):
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.pack_forget()
        self._frame = new_frame
        self._frame.pack()


def main():
    app=App()
    app.geometry("1300x1000") 
    app.mainloop()

if __name__ == '__main__':
    main()

标签: pythontkinter

解决方案


tag_remove是删除突出显示的正确方法。目前尚不清楚您是否只想删除当前位置或任何地方的突出显示。假设您只想在插入点之后突出显示,您可以执行以下操作:

tag_range = self.results_field.tag_nextrange(self.tagA, "insert")
if tag_range:
    self.results_field.tag_remove(self.tagA, *tag_range)

如果您不想这样做,而是想在顶部堆叠另一个标签,您可以使用 更改优先级tag_raise。以下将“隐藏”标签移到上面self.tagA

self.results_field.tag_raise("hide", self.tagA)

推荐阅读