python - 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()
解决方案
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)
推荐阅读
- ruby - Logstash 拆分日志并单独插入到elasticsearch中
- python - 以下语句做了什么 - df.groupby("level")["attempt"].mean()?
- python - Django 模型对象返回无
- linux - Goaccess,格式错误 - 验证您的日志/日期/时间格式
- flask - 如何使用带有 mongodb 的烧瓶对列表进行排序?
- amazon-web-services - Websockets 不适用于 AWS ElasticBeanstalk 部署
- selenium - 向 selenium-standalone NPM 库提供配置文件
- c# - 如何在 Visual Studio 中重命名 WPF 窗口文件?
- r - Sparklyr - 在 spark-submit 中更改日志级别
- laravel - hasMany 关系返回 null 与 mongodb (jenssegers) laravel