在未聚焦的Tkinter文本组件中高亮点击行
我想让输入文本框保持焦点,这样用户输入的内容就能传递到一个单独的显示文本框里。我已经把这个部分搞定了。
但是我不知道怎么做才能让用户点击显示文本框时,点击的那一行高亮显示(或者背景颜色改变),同时焦点又能回到输入框。我还需要保存那一行的引用,这样我才能用其他控件来操作它。
下面是一些示例代码,让你看看我目前的进展。我现在的界面里有很多控件和代码,但我只贴出了和我问题相关的部分:
from Tkinter import *
class GUI:
def __init__(self,root):
Window = Frame(root)
self.OutWidget = Text(Window, state='disabled')
self.InWidget = Text(Window,bg='black',bd=3,fg='white',exportselection=0,height=1,wrap=WORD,insertofftime=0,insertbackground="white")
self.OutWidget.pack()
self.InWidget.pack()
Window.pack()
self.InWidget.focus_set()
self.OutWidget.bind("<Button 1>",self.Select)
self.InWidget.bind("<Return>", self.Post)
def Post(self,event):
text = self.InWidget.get(1.0,2.0)
self.InWidget.delete(1.0,2.0)
self.OutWidget['state'] = ['normal']
self.OutWidget.insert('end',text)
self.OutWidget['state'] = ['disabled']
return ("break")
def Select(self,event):
#highlight the CURRENT line
#store a reference to the line
#return focus to InWidget
self.InWidget.focus()
return ("break")
if __name__ == '__main__':
root = Tk()
App = GUI(root)
root.mainloop()
1 个回答
4
你可以通过类似下面的方式获取你点击的那一行的起始位置:
line_start = self.OutWidget.index("@%s,%s linestart" % (event.x, event.y))
你可以通过给那一行加上一个标签来实现高亮显示,方法类似于:
line_end = self.OutWidget.index("%s lineend" % line_start)
self.OutWidget.tag_remove("highlight", 1.0, "end")
self.OutWidget.tag_add("highlight", line_start, line_end)
你可以用类似下面的方式设置“高亮”标签的颜色:
self.OutWidget.tag_configure("highlight", background="bisque")
你可以用类似下面的方式将焦点移回到另一个窗口:
self.InWidget.focus_set()