tkinter Text做一个类似Editplus字符导航的功能

效果

可以支持中文
在这里插入图片描述

实现思路

*本文提到的方法不知道的请自行百度!

方法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()

不要吝啬你的赞!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值