Tkinter. Работа с цветами и шрифтами

Цвета – это неотъемлемая часть любого приложения, которое запускается на компьютере. С их помощью можно не только сделать интерфейс приятным на глаз, но и обеспечить нужную функциональность приложению. Например, текст определенного цвета может сообщать пользователю о том, можно ли ему совершать какое-то действие или нет.

Продвинутая работа с цветами

Самый простой способ задать цвет – это использовать параметры foreground и background, а потом указать через оператор присваивания соответствующий текст словом. Например, можно ввести цвет white, blue, yellow. Это, конечно, хорошо, но такой подход не очень гибкий. Что, если надо указать не синий цвет, а сиреневый? Или не красный, а фиолетовый.

Для этого необходимо передавать в параметры значение в формате RGB. Собственно, названия цветов, которые указываются, также переводятся приложением в RGB-формат, только автоматически и без вашего непосредственного участия.

Приведем скриншот программы, которое демонстрирует возможности изменения цветов в Tkinter.Tkinter. Работа с цветами и шрифтами

Видим, что эта программа демонстрирует возможности изменения цвета фона и цвета переднего плана. В этом приложении цвета выбираются с помощью стандартного окна Windows, предназначенного для выбора цвета. Также в нем можно задать оттенок самостоятельно через соответствующие поля ввода для красного, зеленого и синего цветов.Tkinter. Работа с цветами и шрифтами

В качестве демонстрации примеров для настроек тех или иных виджетов мы будем использовать кнопки. При этом мы будем использовать диалоговое окно askcolor из модуля tkinter.colorchooser для того, чтобы пользователь мог выбрать тот цвет, который ему нравится.

Сам код приложения выглядит следующим образом.

 

from functools import partial

import tkinter as tk

from tkinter.colorchooser import askcolor




class App(tk.Tk):

    def __init__(self):

        super().__init__()

        self.title("Демо с цветами")

        text = "Шустрая бурая лисица прыгает через ленивого пса"

        self.label = tk.Label(self, text=text)

        self.fg_btn = tk.Button(self, text="Установить цвет текста",

                                command=partial(self.set_color, "fg"))

        self.bg_btn = tk.Button(self, text="Установить цвет фона",

                                command=partial(self.set_color, "bg"))




        self.label.pack(padx=20, pady=20)

        self.fg_btn.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

        self.bg_btn.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)




    def set_color(self, option):

        color = askcolor()[1]

        print("Выбрать цвет:", color)

        self.label.config(**{option: color})




if __name__ == "__main__":

    app = App()

    app.mainloop()

Обратите внимание на блок import и модули, которые необходимо импортировать в программу перед тем, как работать с цветами. Это очень важно.

Если требуется проанализировать RGB-значение цвета, который был выбран, то его записать непосредственно в консоль после того, как пользователь подтвердит свой выбор.

Если же пользователь откажется выбирать цвет, то тогда в консоли не появится никаких значений. 

Как выполняется настройка цвета в Python?

Все кнопки в нашем примере применяют функцию partial() для обратного вызова. Этот инструмент можно найти в модуле functools, с помощью которого можно создать новый вызываемый объект. В целом, он ведет себя точно так же, как и оригинальная функция, но есть несколько фиксаций по аргументам. Давайте приведем такую строку кода в качестве примера.

tk.Button(self, command=partial(self.set_color, «fg»), …)

Действия, выполняемые предыдущей командой, такие же, как и последующей.

tk.Button(self, command=partial(self.set_color, «fg»), …)

Это необходимо сделать для того, чтобы переиспользовать метод set_color(), находящийся в модуле functools

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

Необходимо только помнить о нюансе: foreground и background в сокращенном виде записываются, как fg и bg. Распаковка этих строк осуществляется с использованием ** во время настройки виджета.

 

def set_color(self, option):

        color = askcolor()[1]

        print("Выбрать цвет:", color)

        self.label.config(**{option: color}) # same as (fg=color)

                                or (bg=color)

Функция askcolor() после того, как будет выполнена, передает переменной кортеж с двумя элементами. В первый входит набор цветов RGB, а во втором – представление этого цвета в шестнадцатеричном формате. Так, как невозможно первый аргумент передать в параметры, то для этого используется второй. 

Если необходимо конвертировать цветовое представление в шестнадцатеричный формат, для этого используется метод winfo_rgb(). 

Как задать цвет шрифта в элементе окна Tkinter?

Tkinter предоставляет возможность задать характеристики виджета абсолютно на любых объектах, включая кнопки, метки и записи. Если использовать предустановленные настройки, то текст будет оформляться теми стилями, которые предустановлены в системе. Если же нужно задать произвольные, необходимо использовать параметр font.

Приведем пример приложения, которое предоставляет возможность пользователю динамически изменять тип, размер шрифта.Tkinter. Работа с цветами и шрифтами

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

import tkinter as tk




class App(tk.Tk):

    def __init__(self):

        super().__init__()

        self.title("Демо шрифтов")

        text = "Шустрая бурая лисица прыгает через ленивого пса"

        self.label = tk.Label(self, text=text)




        self.family = tk.StringVar()

        self.family.trace("w", self.set_font)

        families = ("Times", "Courier", "Helvetica")

        self.option = tk.OptionMenu(self, self.family, *families)




        self.size = tk.StringVar()

        self.size.trace("w", self.set_font)

        self.spinbox = tk.Spinbox(self, from_=8, to=18,

                                  textvariable=self.size)




        self.family.set(families[0])

        self.size.set("10")

        self.label.pack(padx=20, pady=20)

        self.option.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

        self.spinbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)




    def set_font(self, *args):

        family = self.family.get()

        size = self.size.get()

        self.label.config(font=(family, size))




if __name__ == "__main__":

    app = App()

    app.mainloop()

Обратите внимание! Переменные в библиотеке Tkinter могут содержать некоторые значения, привязанные к каждому полю, установленные по умолчанию.

Принцип работы настройки шрифтов

Разберем описанный выше код. Кортеж FAMILIES содержит три разновидности шрифтов, поддержка которых имеется на всех платформах – Times New Roman, Courier, Helvetica. Чтобы выбирать подходящий, используется виджет OptionMenu, взаимосвязанный с переменной self.family.

Такой ход дает возможность, в том числе, установить размер шрифта в элементе класса Spinbox. Обе переменные вызывают функцию, изменяющую внешний вид шрифта текста.

def set_font(self, *args):

    family = self.family.get()

    size = self.size.get()

    self.label.config(font=(family, size))

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

С подробным перечнем всех шрифтов, которые можно использовать в программах, можно ознакомиться с помощью метода families(), который расположен в модуле tkinter.font.

Так, как изначально необходимо сгенерировать root, можно также прописать такой код, чтобы реализовать эту задачу. 

Ошибки не будет появляться, если человек попробует использовать шрифт, не соответствующий списку. Он просто подберет какой-то шрифт, напоминающий тот, который был указан. 

В целом, что-то похожее на работу с дескрипторами шрифтов. К примеру, эта последовательность команд делает текст написанным полужирным шрифтом Courier величиной в 18 пикселей.

Чтобы получить значение, необходимо использовать метод cget, а чтобы его задать, требуется применить функцию configure, которая вызывается от объекта шрифта.

family = courier_18.cget(«family»)

courier_18.configure(underline=1)

Применение параметров базы данных

Один из терминов, принятых в Tkinter – это база данных параметров. С помощью нее появляется возможность задать стиль программы без необходимости устанавливать подходящие значения для каждого элемента. Так, появляется возможность ряд параметров виджета не настраивать индивидуально, а задать единую стилевую концепцию, зависящую от иерархии виджетов.

Например, нам нужно написать программу, которая состоит из ряда элементов, имеющих разные стилевые характеристики, заданные в базе данных параметров.Tkinter. Работа с цветами и шрифтами

Чтобы добавить параметры, необходимо использовать такой код.

import tkinter as tk




class App(tk.Tk):

    def __init__(self):

        super().__init__()

        self.title("Демо опции")

        self.option_add("*font", "helvetica 10")

        self.option_add("*header.font", "helvetica 18 bold")

        self.option_add("*subtitle.font", "helvetica 14 italic")

        self.option_add("*Button.foreground", "blue")

        self.option_add("*Button.background", "white")

        self.option_add("*Button.activeBackground", "gray")

        self.option_add("*Button.activeForeground", "black")




        self.create_label(name="header", text="Это 'header'")

        self.create_label(name="subtitle", text="Это 'subtitle'")

        self.create_label(text="Это параграф")

        self.create_label(text="Это следующий параграф")

        self.create_button(text="Больше...")




    def create_label(self, **options):

        tk.Label(self, **options).pack(padx=20, pady=5, anchor=tk.W)




    def create_button(self, **options):

        tk.Button(self, **options).pack(padx=5, pady=5, anchor=tk.E)




if __name__ == "__main__":

    app = App()

    app.mainloop()

Обратите внимание на метод option_add(), с помощью которого мы и выполняем эту задачу.

То есть, нам не надо отдельно задавать цвет заднего фона или передней части виджета. Это уже сделано централизованно по всей программе.

ОфисГуру
Adblock
detector