Python/Tkinter:动态调整字体大小以填充框架

6 投票
2 回答
10961 浏览
提问于 2025-04-18 11:15

我知道可以通过这些命令让框架小部件扩展并填满它们所在容器的所有可用区域:frameName.pack(fill = 'both', expand = True)

那么,有什么方法可以让文本的字体大小也跟着变化呢?目前我的文本是一个标签小部件的属性。这个标签小部件的父级是frameName

我想我可以定义一个自己的函数,调用labelName.config(fontsize = N)来更新字体大小,让它随着框架变大而变化,但我不太确定怎么把它们关联起来。

这是我现在程序的样子:每一个块都是一个框架小部件。我希望文本能够扩展到一定程度填满框架,并且在窗口大小改变时也能响应。

2 个回答

4

我一直在尝试弄明白如何让tkinter中的文本自动调整大小。

对我来说,成功的关键是把计算出来的高度赋值给自定义字体对象的大小。就像这样:self.label_font['size'] = height

完整示例:

from tkinter import font
import tkinter as tk


class SimpleGUIExample:
    def __init__(self, master):
        self.master = master
        self.master.title("A simple Label")
        self.master.bind('<Configure>', self.resize)

        self.label_font = font.Font(self.master, family='Arial', size=12, weight='bold')

        self.label = tk.Label(self.master, text="Simple Label Resizing!")
        self.label.config(font=self.label_font)
        self.label.pack(fill=tk.BOTH, expand=tk.YES)

        self.close_button = tk.Button(self.master, text="Close", command=master.quit)
        self.close_button.pack()

    def resize(self, event):
        height = self.label.winfo_height()
        width = self.label.winfo_width()
        height = height // 2
        print('height %s' % height)
        print('width %s' % width)
        if height < 10 or width < 200:
            height = 10
        elif width < 400 and height > 20:
            height = 20
        elif width < 600 and height > 30:
            height = 30
        else:
            height = 40
        print('height %s' % height)

        self.label_font['size'] = height
        print(self.label_font.actual())


root = tk.Tk()
simple_gui = SimpleGUIExample(root)
root.mainloop()
5

你可以使用 tkFont.font

当你初始化标签时,可以把字体设置成一个变量,比如:

self.font = SOME_BASE_FONT
self.labelName.config(font = self.font)

然后你可以使用:

self.font = tkFont.Font(size = PIXEL_HEIGHT)

这样你就可以根据标签的高度来调整字体大小。你可以给这个组件绑定一个 '<Configure>' 事件,然后让你的回调函数来调整标签的大小。

frameName.bind('<Configure>', self.resize)

def resize(self, event):
    self.font = tkFont(size = widget_height)

想了解更多信息,可以查看文档 这里

撰写回答