Developing a Full Tkinter Object-Oriented Application

2024. 3. 15. 19:30GUI/tkinter

요약 : 이 튜토리얼에서는 완전한 Tkinter 객체 지향 애플리케이션을 개발하는 방법을 배우게 됩니다.

온도 변환기 애플리케이션을 객체 지향 프로그래밍 접근 방식을 사용하는 새로운 애플리케이션으로 변환합니다.

 

 

먼저 TemperatureConverter이라는 클래스를 정의합니다. 이 클래스에는 온도를 화씨에서 섭씨로 변환하는 하나의 정적 메서드가 있습니다.

In [1]:
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showerror


class TemperatureConverter:
    @staticmethod
    def fahrenheit_to_celsius(f):
        return (f - 32) * 5 / 9

둘째, ttk.Frame 클래스에서 상속되는 ConverterFrame 클래스를 정의합니다. ConverterFrame 클래스는 위젯 생성 및 이벤트 처리를 담당합니다.

In [3]:
class ConverterFrame(ttk.Frame):
    def __init__(self, container):
        super().__init__(container)
        # field options
        options = {'padx': 5, 'pady': 5}

        # temperature label
        self.temperature_label = ttk.Label(self, text='Fahrenheit')
        self.temperature_label.grid(column=0, row=0, sticky=tk.W, **options)

        # temperature entry
        self.temperature = tk.StringVar()
        self.temperature_entry = ttk.Entry(self, textvariable=self.temperature)
        self.temperature_entry.grid(column=1, row=0, **options)
        self.temperature_entry.focus()

        self.convert_button = ttk.Button(self, text='Convert')
        self.convert_button['command'] = self.convert
        self.convert_button.grid(column=2, row=0, sticky=tk.W, **options)

        # result label
        self.result_label = ttk.Label(self)
        self.result_label.grid(row=1, columnspan=3, **options)

        # add padding to the frame and show it
        self.grid(padx=10, pady=10, sticky=tk.NSEW)

    def convert(self):
        """  Handle button click event
        """
        try:
            f = float(self.temperature.get())
            c = TemperatureConverter.fahrenheit_to_celsius(f)
            result = f'{f} Fahrenheit = {c:.2f} Celsius'
            self.result_label.config(text=result)
        except ValueError as error:
            showerror(title='Error', message=error)

동작 방식:

  • ConverterFrame 컨테이너가 필요하므로 해당 init() 메서드에는 container 인수가 있습니다.
  • ConverterCFrame 클래스의 __init__() 메서드 내에서 해당 슈퍼클래스의 __init__() 메서드를 호출합니다.
  • ConverterFrame 클래스의 다른 메서드에서 참조할 수 있도록 위젯을 self 개체에 할당합니다.
  • convert 버튼의 command 옵션을 self. convert 메서드에 할당합니다.

셋째, tk.Tk 클래스에서 상속되는 App 클래스를 정의합니다.

In [4]:
class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title('Temperature Converter')
        self.geometry('300x70')
        self.resizable(False, False)

마지막으로 if name == "main" 블록에서 애플리케이션을 부트스트랩합니다.

In [5]:
if __name__ == "__main__":
    app = App()
    ConverterFrame(app)
    app.mainloop()

모두 합치면 다음과 같습니다.

In [6]:
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showerror


class TemperatureConverter:
    @staticmethod
    def fahrenheit_to_celsius(f):
        return (f - 32) * 5 / 9


class ConverterFrame(ttk.Frame):
    def __init__(self, container):
        super().__init__(container)
        # field options
        options = {'padx': 5, 'pady': 5}

        # temperature label
        self.temperature_label = ttk.Label(self, text='Fahrenheit')
        self.temperature_label.grid(column=0, row=0, sticky=tk.W, **options)

        # temperature entry
        self.temperature = tk.StringVar()
        self.temperature_entry = ttk.Entry(self, textvariable=self.temperature)
        self.temperature_entry.grid(column=1, row=0, **options)
        self.temperature_entry.focus()

        self.convert_button = ttk.Button(self, text='Convert')
        self.convert_button['command'] = self.convert
        self.convert_button.grid(column=2, row=0, sticky=tk.W, **options)

        # result label
        self.result_label = ttk.Label(self)
        self.result_label.grid(row=1, columnspan=3, **options)

        # add padding to the frame and show it
        self.grid(padx=10, pady=10, sticky=tk.NSEW)

    def convert(self):
        """  Handle button click event
        """
        try:
            f = float(self.temperature.get())
            c = TemperatureConverter.fahrenheit_to_celsius(f)
            result = f'{f} Fahrenheit = {c:.2f} Celsius'
            self.result_label.config(text=result)
        except ValueError as error:
            showerror(title='Error', message=error)


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

        self.title('Temperature Converter')
        self.geometry('300x70')
        self.resizable(False, False)


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

이 튜토리얼에서는 완전한 객체 지향 Tkinter 애플리케이션을 개발하는 방법을 배웠습니다.

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

Tkinter messagebox  (0) 2024.03.17
Switching between Frames Using the Frame tkraise() Method  (1) 2024.03.16
Tkinter Object-Oriented Frames  (0) 2024.03.14
Tkinter Object-Oriented Window  (0) 2024.03.13
Tkinter Cursors  (0) 2024.03.12