TkInter 标签通过文本长度更改字体大小

2024-01-08

早上好,

I have a Tkinter label with a fixed width. In this label I have set a dynamic text. I need to change the font size (decrease or increase) when the text width is longer than label width. This is an example: enter image description here


为此,您需要为标签指定唯一的字体,然后使用measure字体的方法来计算该字体中给定字符串需要多少空间。然后,您只需不断增加或减小字体大小,直到适合标签即可。

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

import Tkinter as tk
import tkFont

label = tk.Label(...)
original_font = tkFont.nametofont(label.cget("font"))
custom_font = tkFont.Font()
custom_font.configure(**original_font.configure())
label.configure(font=custom_font)

现在你可以使用custom_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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TkInter 标签通过文本长度更改字体大小 的相关文章

随机推荐

  • PHP聊天客户端

    我需要在 php js ajax 中创建一个聊天应用程序 需要将其集成到一个网站中 其中遇到的问题是创建一个聊天窗口 该窗口在浏览网站中的不同页面时需要保持不变 如果有人能提出更好的方法 我将不胜感激 提前致谢 至于实际的聊天应用程序 使用
  • 在 Powershell 中导入 CSV ,每 10 行分成多个文件

    我是 powershell 编码新手 我想做的是导入行数未知的 CSV 文件 然后每 10 行将其拆分为一个新的 CSV 文件 例如 如果我输入 97 行的 CSV 文件 我期望 9 个 10 行的文件和 1 个 7 行的文件 我尝试了以下
  • 浮点运算稳定吗? [复制]

    这个问题在这里已经有答案了 我知道浮点数有精度 精度后面的数字不可靠 但如果用于计算数字的方程相同怎么办 我可以假设结果也会相同吗 例如我们有两个浮点数x and y 我们可以假设结果吗x y机器1的结果和机器2的结果完全一样吗 IE 比较
  • 使用 NSOpenPanel 限制对某些文件夹的访问

    我使用 NSOpenPanel 允许用户选择一个文件夹来保存文档 我想限制它们可以保存到哪个文件夹 就层次结构而言 本质上 我想阻止他们选择上面的任何文件夹 用户 用户名 所以文件夹 用户 用户名 猫 可以接受 但是 用户 用户名 应用程序
  • DataGridView 单击事件并不总是触发

    我有一个DataGridView Its Cell Content Click每次我选择一个单元格时都不会触发 它确实会触发 但不是每次点击时都会触发 我想获取字符串变量 selected 中选定单元格的内容 这是我正在做的事情 priva
  • 在 Google Sheets 电子表格中按名称对工作表进行排序的脚本

    我使用 Google Sheets 电子表格来管理我正在处理的文件 我在任何给定时间都有大约 60 70 个文件 每个文件都有一个唯一的文件编号 每个文件在我的电子表格中都由一个以其文件号命名的唯一工作表表示 文件编号符合以下格式 例如 5
  • 配置文件的 Module.exports 与纯 json

    我看到有多种在 Node js 中创建配置文件的方法 一种在 js 文件中使用 module exports 一种仅使用纯 json 对象 config1 js module exports config 1 value 1 config
  • 使用 NetBeans IDE 在 Java DB 中创建自动增量键

    我来自 MySQL 世界 请帮忙 是否可以从 JavaDB 中的 NetBeans IDE 创建自动增量键 您使用一些更高级的数据库客户端吗 Thanks 这可能会帮助您 CREATE TABLE custinf CUST ID INT n
  • Azure函数:system.private.corelib:执行函数时出现异常

    我正在编写一个用于 PDF 转换的 Azure 函数 它依赖于 DataLogics PDF 转换和用于密码生成的 Nuget 包 mlkpwgen 功能有 using System IO using Microsoft AspNetCor
  • boost绑定类函数指针

    class Foo double f1 int x std string s1 double f2 int x SomeClass s2 我希望能够绑定 Foo f1 的 s1 而无需在 essense 中创建 foo 实例 typedef
  • 压缩或使用覆盖功能时如何在Jimp中保留EXIF数据?

    我尝试使用Jimp作为压缩上传到我的服务器的图像的库 但是 即使图像在我的计算机中旋转 当我将其上传到 jimp 时 我猜它不会处理 exif 方向数据并在压缩后保存未旋转的图片 image exifRotate 不过我在jimp里找到了这
  • 在本机反应中需要类('com.google.android.gms.location.FusedLocationProviderClient'的声明)

    这早些时候工作得很好 可能的未处理的 Promise 拒绝 id 0 错误 调用本机方法时遇到异常 在模块 ExpoLocation 上执行导出方法 getLastKnownPositionAsync 时发生异常 找到接口 com goog
  • Javascript 中相当于 Python 字典 get 方法的是什么

    Python 的字典 get 方法让我可以指定键不存在时应返回的内容 对于我当前的情况 我想要返回一本字典 我如何在 JavaScript 中执行此操作 没有与 python 字典 get 方法等效的 javascript 如果你自己编写它
  • 修改系统时钟时 boost::deadline_timer 可能会失败

    可以在以下位置阅读 https svn boost org trac boost ticket 3504 https svn boost org trac boost ticket 3504 一个定期超时的deadline timer 它是
  • 从 Objective-C 调用 Python

    bbum posted https stackoverflow com questions 1308079 calling python from objective c 1308469 1308469如何执行此操作的概述 但我无法完成详细
  • AngularJS - 从服务调用控制器函数

    我对 Angular 很陌生 我什至不确定我是否正确地构建了对此的搜索 整个指令和服务术语仍然让我有些困惑 但这不是我的问题 我从头到尾阅读了这个优秀的文章系列 http www ng newsletter com posts beginn
  • C 预处理器语句是 C 语言的一部分吗?

    我记得我的一位教授在一门 C 语言入门课程中说过这样的话 他表示 define预处理器命令使程序员能够创建一个常量以在以后的代码中使用 并且该命令是C语言的一部分 Is this truly C code define FOO 42 由于这
  • JSX 中的条件渲染

    如何使用 JSX 进行条件渲染 例如 我在这里有一个 div 如果 props 的值为 null 我想在其中渲染文本 NO IDEA 否则如果它不等于 null 则渲染 props 例如 div return this props date
  • ASP.NET MVC + Ninject:InRequestScope

    我想使用 ninject InRequestScope 创建 PerRequestResourceProvider 的实例 public class PerRequestResourceProvider IPerRequestResourc
  • TkInter 标签通过文本长度更改字体大小

    早上好 I have a Tkinter label with a fixed width In this label I have set a dynamic text I need to change the font size dec