目录
效果
实现思路
*本文提到的方法不知道的请自行百度!
方法1 tkinter.font模块的Font().measure
这种方法可以得到字符串的像素长度,还没试过
方法2 tkinter.Text.bbox
获取当前index(“insert”)的左上角x坐标,用Canvas绘制
使用方法2
准备
import tkinter as tk
root=tk.Tk()
cvs=tk.Canvas(height=10)#height有用
text=tk.Text()
cvs.pack(fill="x",side="top")
text.pack(expand=1,fill="both")
root.after(10,draw)#用draw方法更新
root.mainloop()
编写更新方法draw
def draw(event=None):
"用来绘制“定位”线"
bbox
bbox有4个返回值,其中只需要第一个x就行了
bbox=text.bbox("insert")#获取
size=bbox[0]#x坐标
Canvas删除
需要先把上一次的线删掉。
cvs.delete("all")
绘制
cvs.create_line(0,5,size,5)#横线,5是height(10)的一半
cvs.create_line(size,0,size,10,width=3)#竖线
Loop
root.after(10,draw)
方法2代码全览
"""
使用tkinter.Text.bbox功能,获取当前字符的x坐标
传入tk.Canvas,用来在文本编辑器上面可以快速“定位”当前字符的位置
用bbox可以很好的支持中文
"""
def draw(event=None):
"用来绘制“定位”线"
bbox=text.bbox("insert")#获取
size=bbox[0]#x坐标
cvs.delete("all")#先删除
cvs.create_line(0,5,size,5)#横线,5是height(10)的一半
cvs.create_line(size,0,size,10,width=3)#竖线
root.after(10,draw)
import tkinter as tk
root=tk.Tk()
cvs=tk.Canvas(height=10)#height有用
text=tk.Text()
#text.bind("<KeyPress>",draw) #如果使用event则会不同步&偏移
root.after(10,draw)
cvs.pack(fill="x",side="top")
text.pack(expand=1,fill="both")
root.mainloop()
关于bind
如果你把第18行的#text.bind("<KeyPress>",draw)
注释去掉,并把两个root.after(10,draw)
注释掉,你会发现,它不同步了!
不仅不同步,还会少一格,因为bind调用函数会在响应之前,可以使用text.after()
不要吝啬你的赞!