Ttk Elements

2024. 3. 29. 19:23GUI/tkinter

요약 : 이 튜토리얼에서는 ttk 요소와 이 요소가 위젯 스타일로 결합되는 방법에 대해 알아봅니다.

ttk 요소 소개

지금까지 테마는 모든 ttk 위젯의 모양을 정의하는 스타일 모음이라는 것을 배웠습니다.

스타일은 위젯 클래스의 모양에 대한 설명입니다. 스타일은 하나 이상의 요소로 구성됩니다.

예를 들어 Label는 border, padding 및 label 요소로 구성됩니다. 그리고 이러한 요소는 다음 그림과 같이 서로 중첩되어 있습니다.

 

 

일반적으로 대부분의 내장 ttk 스타일은 레이아웃 개념을 사용하여 위젯을 구성하는 다양한 요소 레이어를 구성합니다.

위젯 클래스의 레이아웃을 얻으려면, 다음과 같은 Style 개체의 layout() 메서드를 사용합니다.

style.layout(widget_class)

위젯 클래스에 레이아웃이 없으면, layout()메서드는 tk.TclError 예외가 발생합니다.

이 layout() 메서드는 튜플(element_name, description) 목록을 반환합니다.

  • element_name는 요소의 이름입니다.
  • description은 요소를 설명하는 사전입니다.

다음 예제에서는 layout() 메서드를 사용하여 TLabel 위젯 클래스의 레이아웃을 가져옵니다.

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


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

        style = ttk.Style(self)

        layout = style.layout('TLabel')
        print(layout)


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

다음 출력은 스타일의 TLabel 레이아웃을 보여줍니다.

 
 

[('Label.border',
        {'sticky': 'nswe',
         'border': '1',
         'children': [('Label.padding',
                           {'sticky': 'nswe',
                            'border': '1',
                            'children': [('Label.label', {'sticky': 'nswe'})]
                            })]
         }
)]

TLabel에는 세 가지 요소가 서로 중첩되어 있습니다.

  • Label.border은 sticky, borde 및 children 키가 있는 가장 바깥쪽 요소입니다.
  • Label.padding은 Label.border 내부에 중첩되어 있습니다. 또한 sticky, border및 children 키도 있습니다.
  • Label.label은 하나의 stcky 키가 있는 가장 안쪽 요소입니다.

예를 들어, 요소가 nswe 값을 가진 sticky 키가 있는 경우, 해당 요소는 부모 요소의 북쪽, 남쪽, 서쪽 및 동쪽에 부착되도록 늘어납니다.

위젯 클래스의 스타일 레이아웃은 현재 테마에 따라 달라집니다. 테마를 변경하면 레이아웃이 달라질 수 있습니다.

요소 옵션

각 요소에는 요소의 모양을 지정하는 옵션 목록이 있습니다. 옵션 이름 목록을 얻으려면 Style 객체의 element_options() 메서드를 사용합니다.

style.element_options(styleName)

다음 프로그램은 Label.border, Label.padding 및 Label.label 요소의 요소 옵션을 보여줍니다.

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


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

        style = ttk.Style(self)

        # layout
        layout = style.layout('TLabel')
        print(layout)

        # element options
        print(style.element_options('Label.border'))
        print(style.element_options('Label.padding'))
        print(style.element_options('Label.label'))


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

이 출력에서:

  • Label.border 요소에는 하나의 옵션 'relief'가 있습니다.
  • Label.padding 요소에는 'padding', 'relief' 및 'shiftrelief'의 세 가지 옵션이 있습니다.
  • Label.label 요소에는 'font', 'foreground', 'with' 등을 포함한 다양한 옵션이 있습니다.

요소 옵션의 속성

요소 옵션과 관련된 속성 목록을 얻으려면, Style 객체의 lookup() 메서드를 사용합니다.

style.lookup(layout_name, option_name)

다음 예에서는 TLabel.label 요소의 font, foreground 및 background 옵션 속성을 보여줍니다.

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


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

        style = ttk.Style(self)

        # attributes of the font, foreground, and background
        # of the Label.label element
        print(style.lookup('Label.label', 'font'))
        print(style.lookup('Label.label', 'foreground'))
        print(style.lookup('Label.label', 'background'))


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

출력에서 명확하게 볼 수 있듯이 글꼴은 TkDefaultFont이고 전경은 SystemWindowText이며 배경은 SystemButtonFace입니다.

코드를 모두 함께 모읍시다

다음은 Label 위젯의 모양을 변경하는 방법을 보여줍니다.

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


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

        self.geometry('500x100')

        message = 'This is an error message!'

        label = ttk.Label(self, text=message, style='Error.TLabel')
        label.pack(expand=True)

        style = ttk.Style(self)

        style.configure('Error.TLabel', foreground='white')
        style.configure('Error.TLabel', background='red')
        style.configure('Error.TLabel', font=('Helvetica', 12))
        style.configure('Error.TLabel', padding=(10, 10))


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

요약

  • ttk 위젯은 요소로 구성됩니다. layout은 어떻게 요소가 위젯을 구성하는 방법을 결정합니다.
  • 위젯 클래스의 레이아웃을 검색하도록 Style.layout() 메서드를 사용합니다.
  • 요소의 요소 옵션을 가져오려면 Style.element_options() 메서드를 사용합니다.
  • 요소 옵션의 속성을 가져오려면 Style.lookup() 메소드를 사용하십시오.

 

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

Tkinter Thread  (0) 2024.03.31
How to Change the Appearances of Widgets Dynamically Using Ttk Style map() Method  (0) 2024.03.30
Ttk Styles  (0) 2024.03.28
Tkinter Themes  (0) 2024.03.27
Tkinter Example  (0) 2024.03.26