Python / Tkinter: динамическое расширение размера шрифта для заполнения фрейма

#python #tkinter #tk

#питон #tkinter #тз

Вопрос:

Я знаю, что вы можете заставить фреймовые виджеты расширяться и заполнять всю доступную им область в их контейнере с помощью этих команд: frameName.pack(fill = 'both', expand = True)

Что бы сделать то же самое для размера шрифта текста? В настоящее время мой текст является атрибутом виджета label. Родительским элементом виджета label является frameName .

Думаю, я мог бы определить свою собственную функцию для вызова labelName.config(fontsize = N) обновления размера шрифта по мере увеличения фрейма, но я не уверен, как их соотнести.

Вот как выглядит моя программа прямо сейчас: каждый из этих блоков представляет собой фреймовый виджет. Я бы хотел, чтобы текст расширялся, чтобы заполнить в некоторой степени фрейм, а также реагировать на изменение размера окна.

Ответ №1:

Вы можете использовать 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)
 

Для получения дополнительной информации см. Документацию здесь .

Комментарии:

1. хорошо, большое спасибо за ответ. Единственное, чего я не понимаю, так это этого <Configure> синтаксиса и того, что он делает.

2. Извините, что ответил так поздно. <Configure> определяет событие. для получения дополнительной информации вы можете посмотреть здесь: effbot.org/tkinterbook/tkinter-events-and-bindings.htm

3. size Параметр принимает высоту в точках , а не в пикселях. Чтобы размер интерпретировался как пиксели, вам нужно использовать отрицательные значения.

Ответ №2:

Я пытался выяснить, как заставить текст автоматически изменять размер в 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()