Python/Tkinter:动态扩展字体大小以填充框架

问题描述 投票:0回答:3

我知道您可以通过以下命令让框架小部件扩展并填充其容器中可用的所有区域:

frameName.pack(fill = 'both', expand = True)

对于文本的字体大小有何作用?目前我的文本是标签小部件的属性。标签小部件的父级是

frameName

我想我可以定义自己的函数来调用

labelName.config(fontsize = N)
以在框架变大时更新字体大小,但我不确定如何将它们关联起来。

这就是我的程序现在的样子: 每个块都是一个框架小部件。我希望文本能够扩展以填充框架的某些容量,并响应窗口大小的调整。

python tkinter tk-toolkit
3个回答
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)

有关更多信息,请参阅文档此处


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()

0
投票

我正在构建一个仪表板,并且有与您相同的任务 - 根据窗口大小动态调整文本大小。

是的,您需要创建一个函数来更新每个标签的文本大小。该函数可以通过事件来运行。就我而言,因为它是仪表板,所以每秒运行几次。

我什至不必使用 tkFonts。对我有用的是:

my_widget.configure( font = ( 'Courier New', -22, 'normal' ) )

负输入意味着这被解释为像素。正输入是点。像素更精确一点,所以我正在使用它们。

最后 - 选择理想的窗口尺寸,例如1920x1080。然后为每个不同的标签选择理想的字体大小,例如-22。然后获取当前窗口大小并按比例调整字体像素。我认为这对我的申请很有效。这当然是最简单的事情。

ratio = tk_window.winfo_width() / 1920
my_widget.configure( font = ( 'Courier New', int( ratio * -22 ), 'normal' ) )
© www.soinside.com 2019 - 2024. All rights reserved.