Jar*_*rad 3 python tags text bind tkinter
我试图修改由布赖恩·奥克利提供了一些惊人的代码,在一个Tkinter的文本小亮点(标签)的话在一个ButtonRelease-1事件。
我不想突出显示一个单词,而是单击一些文本,将鼠标拖到同一行的另一区域(左或右),然后突出显示该范围wordstart和wordend边界的整个范围。
例如,如果在下面的代码中,单击tk之后第一行的末尾,将鼠标拖到import单词的p并释放鼠标按钮,我希望标签扩展以捕获从到的整个范围。1.01.20
下面的代码使用两个tk.StringVar捕获开始和结束字符串,但是从获得的两个索引中,我将如何将这些开始和结束点应用于范围,然后展开以突出显示到wordstartand wordend范围?
import tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.text = tk.Text(self, wrap="none")
self.text.pack(fill="both", expand=True)
self.start = tk.StringVar()
self.end = tk.StringVar()
self.text.bind("<Button-1>", self.button_down)
self.text.bind("<ButtonRelease-1>", self.button_up)
#self.text.bind("<B1-Motion>", self._on_click)
self.text.tag_configure("highlight", background="green", foreground="black")
with open(__file__, "rU") as f:
data = f.read()
self.text.insert("1.0", data)
def button_down(self, event):
self.start.set(self.text.index('@%s,%s' % (event.x, event.y)))
print(self.start.get())
def button_up(self, event):
self.end.set(self.text.index('@%s,%s' % (event.x, event.y)))
print(self.end.get())
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
您可以追加"wordstart"或附加"wordend"到任何有效索引。另外,您不需要使用StringVar-这样会增加复杂性,并且不会提供比普通变量更多的值:
这是一种实现方法:
def button_down(self, event):
self.start = self.text.index('@%s,%s wordstart' % (event.x, event.y))
def button_up(self, event):
self.end = self.text.index('@%s,%s wordend' % (event.x, event.y))
self.text.tag_add("highlight", self.start, self.end)
Run Code Online (Sandbox Code Playgroud)