Developing a Full Tkinter Object-Oriented Application
2024. 3. 15. 19:30ㆍGUI/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 |