Ttk Styles

2024. 3. 28. 19:08GUI/tkinter

요약 : 이 튜토리얼에서는 ttk 스타일, 위젯 스타일을 사용하고 사용자 정의하는 방법, 내장 스타일을 확장하여 위젯의 모양을 변경하는 방법에 대해 알아봅니다.

ttk 스타일 소개

ttk 위젯의 모양을 결정하는 스타일 모음의 테마 입니다.

스타일은 위젯 클래스의 모양에 대한 설명입니다. 일반적으로 테마에는 미리 정의된 스타일 세트가 함께 제공됩니다.

따라서 ttk 위젯의 모양을 변경하면 다음을 수행할 수 있습니다.

  • 기본 제공 스타일 수정
  • 새로운 스타일 만들기

일반적으로 ttk 위젯의 스타일 이름은 'T' 문자로 시작하고 그 뒤에 위젯 이름이 옵니다(예: TLabel 및 TButton).

Tkinter에서 모든 위젯에는 기본 위젯 클래스가 있습니다. 위젯 클래스는 위젯의 기본 스타일을 정의합니다.

다음 표는 일반적인 ttk 위젯 클래스의 스타일 이름을 보여줍니다.

위젯 클래스스타일 이름
Button TButton
Checkbutton TCheckbutton
Combobox TCombobox
Entry TEntry
Frame TFrame
Label TLabel
LabelFrame TLabelFrame
Menubutton TMenubutton
Notebook TNotebook
PanedWindow TPanedwindow
Progressbar* orient 옵션에 따라 Horizontal.TProgressbar 또는 Vertical.TProgressbar가 옵니다.
Radiobutton TRadiobutton
Scale* orient 옵션에 따라 Horizontal.TScale 또는 Vertical.TScale이 옵니다.
Scrollbar* orient 옵션에 따라 Horizontal.TScrollbar 또는 Vertical.TScrollbar가 옵니다.
Separator TSeparator
Sizegrip TSizegrip
Treeview* Treeview

(*) Progressbar, Scale, Scrollbar, Treeview 위젯의 스타일 이름은 'T' 문자로 시작하지 않습니다.

런타임시 위젯 인스턴스의 winfo_class() 메소드를 호출하여 위젯의 위젯 클래스를 가져올 수 있습니다.

다음 예제에서는 winfo_class() 메서드를 사용하여 버튼 위젯의 위젯 클래스를 가져옵니다.

button = ttk.Button(root, text='Click Me')
print(button.winfo_class())

출력 :

TButton

내장 ttk 스타일 수정

모든 스타일에는 위젯의 모양을 정의하는 옵션 세트가 있습니다.

스타일의 모양을 수정하려면 Style 클래스의 configure() 메서드를 사용합니다.

style = ttk.Style(root)
style.configure(style_name, **options)

다음 프로그램은 TLabel 및 TButton의 스타일을 수정하여 모든 Label및 Button 위젯의 글꼴을 변경하는 방법을 보여줍니다.

In [ ]:
import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.geometry('300x110')
        self.resizable(0, 0)
        self.title('Login')

        # UI options
        paddings = {'padx': 5, 'pady': 5}
        entry_font = {'font': ('Helvetica', 11)}

        # configure the grid
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=3)

        username = tk.StringVar()
        password = tk.StringVar()

        # username
        username_label = ttk.Label(self, text="Username:")
        username_label.grid(column=0, row=0, sticky=tk.W, **paddings)

        username_entry = ttk.Entry(self, textvariable=username, **entry_font)
        username_entry.grid(column=1, row=0, sticky=tk.E, **paddings)

        # password
        password_label = ttk.Label(self, text="Password:")
        password_label.grid(column=0, row=1, sticky=tk.W, **paddings)

        password_entry = ttk.Entry(
            self, textvariable=password, show="*", **entry_font)
        password_entry.grid(column=1, row=1, sticky=tk.E, **paddings)

        # login button
        login_button = ttk.Button(self, text="Login")
        login_button.grid(column=1, row=3, sticky=tk.E, **paddings)

        # configure style
        self.style = ttk.Style(self)
        self.style.configure('TLabel', font=('Helvetica', 11))
        self.style.configure('TButton', font=('Helvetica', 11))


if __name__ == "__main__":
    app = App()
    app.mainloop()

 

 

동작 방식.

먼저 ttk.Style 클래스의 새 인스턴스를 만듭니다.

In [ ]:
self.style = ttk.Style(self)

둘째, Style 객체의 configure() 메서드를 사용하여 TLabel및 TButton의 스타일 글꼴을 변경합니다.

In [ ]:
self.style.configure('TLabel', font=('Helvetica', 12))
self.style.configure('TButton', font=('Helvetica', 12))

내장 ttk 스타일 확장

내장 스타일에서 파생된 새 스타일을 만들려면 다음과 같은 스타일 이름을 사용합니다.

In [ ]:
new_style.builtin_style

예를 들어, 제목을 표시하는 데 사용되는 Label 위젯의 새 스타일을 생성하려면, 이름을 다음과 같이 지정할 수 있습니다.

In [ ]:
Heading.TLabel

Heading.TLabel 스타일은 내장 TLabel 스타일의 모든 옵션을 상속합니다.

특정 옵션을 재정의하려면, Style 클래스의 configure() 메서드를 사용합니다.

In [ ]:
style = ttk.Style(self)
style.configure(custom_style, **options)

다음 예에서는 로그인 창에 제목을 추가합니다. 제목에는 TLabel 스타일에서 파생된 스타일이 있습니다.

In [ ]:
import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.geometry('300x150')
        self.resizable(0, 0)
        self.title('Login')

        # UI options
        paddings = {'padx': 5, 'pady': 5}
        entry_font = {'font': ('Helvetica', 11)}

        # configure the grid
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=3)

        username = tk.StringVar()
        password = tk.StringVar()

        # heading
        heading = ttk.Label(self, text='Member Login', style='Heading.TLabel')
        heading.grid(column=0, row=0, columnspan=2, pady=5, sticky=tk.N)

        # username
        username_label = ttk.Label(self, text="Username:")
        username_label.grid(column=0, row=1, sticky=tk.W, **paddings)

        username_entry = ttk.Entry(self, textvariable=username, **entry_font)
        username_entry.grid(column=1, row=1, sticky=tk.E, **paddings)

        # password
        password_label = ttk.Label(self, text="Password:")
        password_label.grid(column=0, row=2, sticky=tk.W, **paddings)

        password_entry = ttk.Entry(
            self, textvariable=password, show="*", **entry_font)
        password_entry.grid(column=1, row=2, sticky=tk.E, **paddings)

        # login button
        login_button = ttk.Button(self, text="Login")
        login_button.grid(column=1, row=3, sticky=tk.E, **paddings)

        # configure style
        self.style = ttk.Style(self)
        self.style.configure('TLabel', font=('Helvetica', 11))
        self.style.configure('TButton', font=('Helvetica', 11))

        # heading style
        self.style.configure('Heading.TLabel', font=('Helvetica', 12))


if __name__ == "__main__":
    app = App()
    app.mainloop()

 

 

동작 방식.

먼저 창에 제목을 추가하고 Label 위젯의 style 옵션에 Heading.TLabel 스타일을 할당합니다.

heading = ttk.Label(self, text='Member Login', style='Heading.TLabel')

그런 다음 Heading.TLabel 스타일 글꼴을 Helvetica, 12픽셀로 변경합니다.

self.style.configure('Heading.TLabel', font=('Helvetica', 12))

스타일의 계층 구조

자신만의 전체 스타일 계층 구조를 만드는 것이 가능합니다. 예를 들어, 기존에 만들어진 TLabel 스타일에서 상속된 Message.TLabel 스타일을 가질 수 있습니다.

그런 다음 Error.Message.TLabel, Warning.Message.TLabel 과 Information.Message.TLabel 같은 Message.TLabel 스타일을 상속하는 스타일을 만들 수 있습니다.

특정 스타일을 사용하는 경우 즉, Error.Message.TLabel, ttk는 먼저 Error.Message.TLabel 스타일에서 옵션을 찾습니다. 옵션을 찾지 못하면, Message.TLabel 스타일에서 검색합니다. 그리고 TLabel 스타일의 옵션을 계속 검색합니다.

다음 그림은 스타일 계층 구조의 예를 보여줍니다.

 

 

루트 스타일은 모든 위젯의 모양을 결정합니다. 루트 스타일의 이름은 '.' 입니다.

예를 들어, 모든 위젯의 텍스트를 12픽셀 Helvetica 글꼴로 변경하려면, 다음과 같이 구성하면 됩니다.

style = ttk.Style(root)
style.configure('.', font=('Helvetica', 12))

요약

  • 스타일 컬렉션의 테마입니다. 스타일은 위젯의 모양에 대한 설명입니다.
  • 위젯의 위젯 클래스를 가져오려면 widget.winfo_class() 메서드를 사용하세요. 위젯 클래스는 위젯의 기본 스타일을 정의합니다.
  • style.configure() 메서드를 사용하여 위젯의 스타일을 수정합니다.
  • 내장 스타일을 사용자 정의하려면, new_style.buildin_style이라는 스타일 이름을 사용하여 확장할 수 있습니다.

'GUI > tkinter' 카테고리의 다른 글

How to Change the Appearances of Widgets Dynamically Using Ttk Style map() Method  (0) 2024.03.30
Ttk Elements  (1) 2024.03.29
Tkinter Themes  (0) 2024.03.27
Tkinter Example  (0) 2024.03.26
Tkinter OptionMenu  (0) 2024.03.26