Рассмотрим, как использовать метод ttk Style map() в Python для динамического изменения внешнего вида виджета в зависимости от его конкретного состояния.
Как правило, виджет ttk позволяет изменять свой внешний вид в зависимости от определенного состояния.
В следующей таблице представлен список состояний виджета и их значения:
| Состояние | Значение |
|---|---|
| active | В данный момент мышь находится внутри виджета. |
| alternate | Ttk зарезервировал это состояние для использования приложениями. |
| background | Виджет находится в окне, которое не является окном переднего плана. Окно переднего плана — это окно, которое получает пользовательский ввод. Это состояние относится только к Windows и macOS. |
| disabled | Виджет не будет реагировать ни на какие действия. |
| focus | Виджет в данный момент находится в фокусе. |
| invalid | Значение виджета в данный момент недействительно. |
| pressed | Виджет в данный момент нажат или щелкается, например, при нажатии виджета «Кнопка». |
| readonly | Не позволяет изменять текущее значение, например, виджет «Ввод», доступный только для чтения, не позволит изменять его текстовое содержимое. |
| selected | Виджет выбирается, например, когда отмечены переключатели. |
Чтобы динамически изменить внешний вид виджета, можно использовать метод map() объекта Style:
style.map(style_name, query)
Метод map() принимает первый аргумент как style_name, например, TButton и TLabel.
Аргумент query представляет собой список ключевых аргументов, где каждый ключ представляет собой параметр стиля, а значения представляют собой списки кортежей(состояние, значение).
Например, следующий код динамически изменяет цвет переднего плана виджета button:
import tkinter as tk
from tkinter import ttk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('300x100')
button = ttk.Button(self, text="Save")
button.pack(expand=True)
style = ttk.Style(self)
style.configure('TButton', font=('Helvetica', 16))
style.map('TButton',
foreground=[('pressed', 'blue'),
('active', 'red')])
print(style.layout('TButton'))
if __name__ == "__main__":
app = App()
app.mainloop()
В этом примере, когда вы перемещаете фокус на кнопку, цвет ее текста меняется на красный. А когда вы щелкаете или нажимаете кнопку, цвет ее текста становится синим.
Выход:

