Python TkInter标签按文本长度更改字体大小

Python TkInter标签按文本长度更改字体大小,python,user-interface,tkinter,Python,User Interface,Tkinter,早上好 我有一个固定宽度的Tkinter标签。在这个标签中,我设置了一个动态文本。当文本宽度大于标签宽度时,我需要更改字体大小(减小或增大)。 这是一个示例:要做到这一点,您需要给标签一个唯一的字体,然后使用字体的度量方法来计算该字体中给定字符串需要多少空间。然后,您只需要不断增加或减少字体大小,直到它适合标签 使用自定义字体创建标签的简单方法如下所示(对于python 2.x;对于3.x,导入将略有不同): 现在,您可以使用custom\u font.measure(…)计算标签在当前字体大小

早上好

我有一个固定宽度的Tkinter标签。在这个标签中,我设置了一个动态文本。当文本宽度大于标签宽度时,我需要更改字体大小(减小或增大)。
这是一个示例:

要做到这一点,您需要给标签一个唯一的字体,然后使用字体的
度量方法来计算该字体中给定字符串需要多少空间。然后,您只需要不断增加或减少字体大小,直到它适合标签

使用自定义字体创建标签的简单方法如下所示(对于python 2.x;对于3.x,导入将略有不同):

现在,您可以使用
custom\u font.measure(…)
计算标签在当前字体大小下需要多少像素。如果像素数太大,请更改字体大小并重新测量。重复,直到字体刚好足够容纳文本

更改字体大小时,标签将自动以新字体大小重新绘制文本

下面是一个完整的工作示例,演示了该技术:

import Tkinter as tk
import tkFont

class DynamicLabel(tk.Label):
    def __init__(self, *args, **kwargs):
        tk.Label.__init__(self, *args, **kwargs)

        # clone the font, so we can dynamically change
        # it to fit the label width
        font = self.cget("font")
        base_font = tkFont.nametofont(self.cget("font"))
        self.font = tkFont.Font()
        self.font.configure(**base_font.configure())
        self.configure(font=self.font)

        self.bind("<Configure>", self._on_configure)

    def _on_configure(self, event):
        text = self.cget("text")

        # first, grow the font until the text is too big,
        size = self.font.actual("size")
        while size < event.width:
            size += 1
            self.font.configure(size=size)

        # ... then shrink it until it fits
        while size > 1 and self.font.measure(text) > event.width:
            size -= 1
            self.font.configure(size=size)

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.label = DynamicLabel(self, text="Resize the window to see the font change", width=20)
        self.label.pack(fill="both", expand=True, padx=20, pady=20)

        parent.geometry("300x200")

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()
将Tkinter作为tk导入
导入tkFont
类动态标签(tk.Label):
定义初始化(self,*args,**kwargs):
tk.Label.\uuuu init\uuuuu(self,*args,**kwargs)
#克隆字体,以便我们可以动态更改
#它与标签宽度相匹配
font=self.cget(“font”)
base\u font=tkFont.nametofont(self.cget(“font”))
self.font=tkFont.font()
self.font.configure(**base\u font.configure())
self.configure(font=self.font)
self.bind(“,self.\u on\u configure)
def_on_配置(自身、事件):
text=self.cget(“text”)
#首先,增大字体,直到文本太大,
size=self.font.actual(“大小”)
当大小1且self.font.measure(text)>event.width时:
尺寸-=1
self.font.configure(大小=大小)
类示例(tk.Frame):
定义初始化(自身,父级):
tk.Frame.\uuuu init\uuuuu(自,父)
self.label=DynamicLabel(self,text=“调整窗口大小以查看字体更改”,宽度=20)
self.label.pack(fill=“both”,expand=True,padx=20,pady=20)
父几何体(“300x200”)
如果名称=“\uuuuu main\uuuuuuuu”:
root=tk.tk()
示例(root).pack(fill=“both”,expand=True)
root.mainloop()

要做到这一点,您需要给标签一个唯一的字体,然后使用字体的
度量方法来计算该字体中给定字符串需要多少空间。然后,您只需要不断增加或减少字体大小,直到它适合标签

使用自定义字体创建标签的简单方法如下所示(对于python 2.x;对于3.x,导入将略有不同):

现在,您可以使用
custom\u font.measure(…)
计算标签在当前字体大小下需要多少像素。如果像素数太大,请更改字体大小并重新测量。重复,直到字体刚好足够容纳文本

更改字体大小时,标签将自动以新字体大小重新绘制文本

下面是一个完整的工作示例,演示了该技术:

import Tkinter as tk
import tkFont

class DynamicLabel(tk.Label):
    def __init__(self, *args, **kwargs):
        tk.Label.__init__(self, *args, **kwargs)

        # clone the font, so we can dynamically change
        # it to fit the label width
        font = self.cget("font")
        base_font = tkFont.nametofont(self.cget("font"))
        self.font = tkFont.Font()
        self.font.configure(**base_font.configure())
        self.configure(font=self.font)

        self.bind("<Configure>", self._on_configure)

    def _on_configure(self, event):
        text = self.cget("text")

        # first, grow the font until the text is too big,
        size = self.font.actual("size")
        while size < event.width:
            size += 1
            self.font.configure(size=size)

        # ... then shrink it until it fits
        while size > 1 and self.font.measure(text) > event.width:
            size -= 1
            self.font.configure(size=size)

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.label = DynamicLabel(self, text="Resize the window to see the font change", width=20)
        self.label.pack(fill="both", expand=True, padx=20, pady=20)

        parent.geometry("300x200")

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()
将Tkinter作为tk导入
导入tkFont
类动态标签(tk.Label):
定义初始化(self,*args,**kwargs):
tk.Label.\uuuu init\uuuuu(self,*args,**kwargs)
#克隆字体,以便我们可以动态更改
#它与标签宽度相匹配
font=self.cget(“font”)
base\u font=tkFont.nametofont(self.cget(“font”))
self.font=tkFont.font()
self.font.configure(**base\u font.configure())
self.configure(font=self.font)
self.bind(“,self.\u on\u configure)
def_on_配置(自身、事件):
text=self.cget(“text”)
#首先,增大字体,直到文本太大,
size=self.font.actual(“大小”)
当大小1且self.font.measure(text)>event.width时:
尺寸-=1
self.font.configure(大小=大小)
类示例(tk.Frame):
定义初始化(自身,父级):
tk.Frame.\uuuu init\uuuuu(自,父)
self.label=DynamicLabel(self,text=“调整窗口大小以查看字体更改”,宽度=20)
self.label.pack(fill=“both”,expand=True,padx=20,pady=20)
父几何体(“300x200”)
如果名称=“\uuuuu main\uuuuuuuu”:
root=tk.tk()
示例(root).pack(fill=“both”,expand=True)
root.mainloop()

您的问题是什么?这样做有什么问题?tkinter
tkFont
s有一种方法,可以返回字符串在字体中的宽度像素数,所以你可以用它来决定是增大还是减小尺寸。@martineau谢谢you@BryanOakley我需要以像素为单位设置字体宽度,或者设置像wraplength这样的设置,当字体宽度大于标签宽度时调整字体大小。为什么有人投票否决我的问题?你的问题是什么?这样做有什么问题?tkinter
tkFont
s有一种方法,可以返回字符串在字体中的宽度像素数,所以你可以用它来决定是增大还是减小尺寸。@martineau谢谢you@BryanOakley我需要以像素为单位设置字体宽度,或者设置像wraplength这样的设置,当字体宽度大于标签宽度时调整字体大小为什么有人投票否决我的问题?