如何解决Tkinter Text组件使用TkDefaultFont时出现尾部多余空白的问题
问题原因
你遇到的尾部空白问题本质是字体类型和Text组件宽度单位的匹配问题:
TkFixedFont是等宽字体,所有字符宽度完全一致,Text组件的width参数默认单位是单字符宽度,所以设置width=len(myText)刚好等于文本总宽度,不会出现多余空白。TkDefaultFont是比例字体,不同字符的宽度各不相同,Text的width参数单位是「0字符的平均宽度」,用字符串长度作为width值时,实际文本总像素宽度会小于字符长度*平均字符宽度,所以会出现尾部空白,且文本越长,累积的宽度差越大,也就出现了你观察到的空白长度和文本长度成正比的现象。- 另外Text组件默认自带的左右内边距(
padx)和边框宽度(borderwidth)也会额外增加一点尾部空白。
解决方案
你可以通过tkinter自带的字体计算能力,直接获取文本的实际像素宽度,再设置给Text组件即可,修改后的可运行代码如下:
from tkinter import * from tkinter import font root = Tk() myText = 'sample text' # 获取TkDefaultFont的实际字体对象 default_font = font.nametofont("TkDefaultFont") # 计算目标文本在该字体下的实际像素宽度 text_pixel_width = default_font.measure(myText) text = Text(root, bg='#c2d9ff', font='TkDefaultFont', height=1, # 关闭默认内边距和边框,避免额外空白,也可保留后自行加到宽度计算值中 padx=0, borderwidth=0 ) text.insert(INSERT, myText) # place时直接指定宽度为计算出的像素值 text.place(x=0,y=0, width=text_pixel_width) # 如果需要文本可编辑时自动适配宽度,可添加以下绑定 # def adjust_width(event): # content = text.get("1.0", END).strip() # text.place_configure(width=default_font.measure(content)) # text.bind("<KeyRelease>", adjust_width) root.mainloop()
这个方案不管使用什么比例字体、文本长度多少,都能让文本框的右边缘刚好贴合文本末尾,不会出现多余空白。
内容的提问来源于stack exchange,提问作者camball
相关产品推荐
相关产品推荐

