从 tkinter 文本小部件中删除尾随 space
Remove trailing space from tkinter Text widget
我的目标是让文本框的右边缘适合文本的末尾。这在使用 TkFixedFont
时会自动发生,但在使用 TkDefaultFont
时(这是我想使用的),末尾添加了尾随的白色 space。这是没有尾随 space 和 TkFixedFont
:
的样子
请注意尾随 space 是最小的。我想要相同的近 none 数量的尾随 space,但是在使用 TkDefaultFont
.
时
以下是我的代码的最小示例:
from tkinter import *
root = Tk()
myText = 'sample text'
text = Text(root, bg='#c2d9ff',
font='TkDefaultFont',
height=1, width=len(myText)
)
text.insert(INSERT, myText)
text.place(x=0,y=0)
root.mainloop()
我已经搜索了大约两个小时,寻找与间距、尾随 space、小部件类型(例如,标签与文本等)、小部件选项等相关的所有内容,但一无所获不幸的是。
它似乎与文本的长度成正比,我无法弄清楚。使用上面的代码,当 myText = 'Some text goes here'
时,尾随间距为:
但是当我输入较长的文本字符串时,尾随 space 似乎成比例地增加:
任何关于如何删除尾随 space 的建议将不胜感激!
您看到的不是白色space 个字符,它只是空字符space。实际宽度是给定字符数乘以平均大小字符的像素数(我认为 tkinter 使用字符“0”)。在变宽字体中,“.”比“W”窄,因此字符串的实际宽度取决于字符串中的字符。
换句话说,如果你的文字是由窄字符组成的(例如:“......”),那么空的会更多space,如果它是由宽字符(例如:“WWWWWWWWWWW”)将会更少。
您可以使用字体对象的 measure
方法计算文本的实际宽度。一旦您确切知道您的文本字符串需要多少像素,您就可以使用该信息来适当地设置文本小部件的大小。
from tkinter import *
from tkinter.font import nametofont
root = Tk()
myText = 'sample text'
font = nametofont("TkDefaultFont")
width = font.measure(myText)
text = Text(root, bg='#c2d9ff',
font='TkDefaultFont',
height=1, width=len(myText)
)
text.insert(INSERT, myText)
text.place(x=0,y=0, width=width)
root.mainloop()
请注意,当您将宽度与 place
一起使用时,它指定了小部件的整个宽度,而不仅仅是边框内的宽度。您需要调整宽度以考虑文本小部件的边框和突出显示的厚度,并且可能需要调整一些其他像素用于内部填充。
例如,如果文本本身占用 100 像素,而文本小部件有两个像素的边框和一个像素的高亮环,则在用于调用 place
.
可以通过Text.dlineinfo()
得到myText
占用的面积,并根据结果调整text
的宽度以及space横向占用的相关设置,例如边框宽度、padx 等:
myText = 'sample text'*4
text = Text(root, bg='#c2d9ff',
font='TkDefaultFont',
height=1
)
text.insert(INSERT, myText)
text.place(x=0, y=0)
text.update_idletasks() # make sure the widget is laid out completely
x, y, w, h, _ = text.dlineinfo(INSERT)
text.place(width=x+w+(text['bd']+text['padx'])*2) # adjust the width
我的目标是让文本框的右边缘适合文本的末尾。这在使用 TkFixedFont
时会自动发生,但在使用 TkDefaultFont
时(这是我想使用的),末尾添加了尾随的白色 space。这是没有尾随 space 和 TkFixedFont
:
请注意尾随 space 是最小的。我想要相同的近 none 数量的尾随 space,但是在使用 TkDefaultFont
.
以下是我的代码的最小示例:
from tkinter import *
root = Tk()
myText = 'sample text'
text = Text(root, bg='#c2d9ff',
font='TkDefaultFont',
height=1, width=len(myText)
)
text.insert(INSERT, myText)
text.place(x=0,y=0)
root.mainloop()
我已经搜索了大约两个小时,寻找与间距、尾随 space、小部件类型(例如,标签与文本等)、小部件选项等相关的所有内容,但一无所获不幸的是。
它似乎与文本的长度成正比,我无法弄清楚。使用上面的代码,当 myText = 'Some text goes here'
时,尾随间距为:
但是当我输入较长的文本字符串时,尾随 space 似乎成比例地增加:
任何关于如何删除尾随 space 的建议将不胜感激!
您看到的不是白色space 个字符,它只是空字符space。实际宽度是给定字符数乘以平均大小字符的像素数(我认为 tkinter 使用字符“0”)。在变宽字体中,“.”比“W”窄,因此字符串的实际宽度取决于字符串中的字符。
换句话说,如果你的文字是由窄字符组成的(例如:“......”),那么空的会更多space,如果它是由宽字符(例如:“WWWWWWWWWWW”)将会更少。
您可以使用字体对象的 measure
方法计算文本的实际宽度。一旦您确切知道您的文本字符串需要多少像素,您就可以使用该信息来适当地设置文本小部件的大小。
from tkinter import *
from tkinter.font import nametofont
root = Tk()
myText = 'sample text'
font = nametofont("TkDefaultFont")
width = font.measure(myText)
text = Text(root, bg='#c2d9ff',
font='TkDefaultFont',
height=1, width=len(myText)
)
text.insert(INSERT, myText)
text.place(x=0,y=0, width=width)
root.mainloop()
请注意,当您将宽度与 place
一起使用时,它指定了小部件的整个宽度,而不仅仅是边框内的宽度。您需要调整宽度以考虑文本小部件的边框和突出显示的厚度,并且可能需要调整一些其他像素用于内部填充。
例如,如果文本本身占用 100 像素,而文本小部件有两个像素的边框和一个像素的高亮环,则在用于调用 place
.
可以通过Text.dlineinfo()
得到myText
占用的面积,并根据结果调整text
的宽度以及space横向占用的相关设置,例如边框宽度、padx 等:
myText = 'sample text'*4
text = Text(root, bg='#c2d9ff',
font='TkDefaultFont',
height=1
)
text.insert(INSERT, myText)
text.place(x=0, y=0)
text.update_idletasks() # make sure the widget is laid out completely
x, y, w, h, _ = text.dlineinfo(INSERT)
text.place(width=x+w+(text['bd']+text['padx'])*2) # adjust the width