Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Cách sử dụng Object-Oriented Application trong Tkinter
Việc phát triển ứng dụng giao diện người dùng (GUI) trở nên vô cùng quan trọng để tạo ra những trải nghiệm người dùng trực quan và dễ sử dụng. Tkinter, một thư viện mạnh mẽ và dễ tiếp cận trong Python, cho phép các nhà phát triển xây dựng các ứng dụng GUI một cách nhanh chóng. Trong bài viết này, mình sẽ cùng tìm hiểu cách áp dụng phương pháp lập trình hướng đối tượng (OOP) vào việc xây dựng một ứng dụng Tkinter hoàn chỉnh. Bằng cách áp dụng OOP, mã nguồn sẽ trở nên dễ quản lý, mở rộng và bảo trì hơn, giúp bạn xây dựng các ứng dụng phức tạp và chuyên nghiệp.
Giới thiệu Object-Oriented Application trong Tkinter
Mình sẽ chuyển đổi ứng dụng chuyển đổi nhiệt độ từ Fahrenheit sang Celsius sang một ứng dụng mới sử dụng cách tiếp cận lập trình hướng đối tượng:
Bước 1: Đầu tiên, định nghĩa một lớp gọi là TemperatureConverter
. Lớp này sẽ có một phương thức tĩnh để chuyển đổi nhiệt độ từ Fahrenheit sang Celsius:
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
Bước 2: Tiếp theo, định nghĩa một lớp ConverterFrame
kế thừa từ lớp ttk.Frame
. Lớp ConverterFrame
sẽ chịu trách nhiệm tạo các widget và xử lý sự kiện:
Bài viết này được đăng tại [free tuts .net]
class ConverterFrame(ttk.Frame): def __init__(self, container): super().__init__(container) # thiết lập các tùy chọn cho trường options = {'padx': 5, 'pady': 5} # nhãn nhiệt độ self.temperature_label = ttk.Label(self, text='Fahrenheit') self.temperature_label.grid(column=0, row=0, sticky=tk.W, **options) # ô nhập nhiệt độ 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() # nút chuyển đổi 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) # nhãn kết quả self.result_label = ttk.Label(self) self.result_label.grid(row=1, columnspan=3, **options) # thêm khoảng đệm vào khung và hiển thị nó self.grid(padx=10, pady=10, sticky=tk.NSEW) def convert(self): """ Xử lý sự kiện khi nhấn nút """ 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)
Cách hoạt động:
- Lớp
ConverterFrame
cần một container, vì vậy, phương thức__init__()
của nó có đối số container. - Bên trong phương thức
__init__()
của lớpConverterFrame
, gọi phương thức__init__()
của lớp cha. - Gán các widget cho đối tượng
self
để bạn có thể tham chiếu chúng trong các phương thức khác của lớpConverterFrame
. - Gán tùy chọn
command
của nút chuyển đổi cho phương thứcself.convert
.
Bước 3: Định nghĩa một lớp App
kế thừa từ lớp tk.Tk
:
class App(tk.Tk): def __init__(self): super().__init__() self.title('Temperature Converter') self.geometry('300x70') self.resizable(False, False)
Bước 4: Cuối cùng, khởi động ứng dụng từ khối if __name__ == "__main__"
:
if __name__ == "__main__": app = App() ConverterFrame(app) app.mainloop()
Tổng hợp:
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) options = {'padx': 5, 'pady': 5} self.temperature_label = ttk.Label(self, text='Fahrenheit') self.temperature_label.grid(column=0, row=0, sticky=tk.W, **options) 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) self.result_label = ttk.Label(self) self.result_label.grid(row=1, columnspan=3, **options) self.grid(padx=10, pady=10, sticky=tk.NSEW) def convert(self): 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()
Kết bài
Qua bài hướng dẫn này, bạn đã học cách phát triển một ứng dụng Tkinter hoàn chỉnh bằng cách áp dụng lập trình hướng đối tượng (OOP). Bằng cách tách biệt các chức năng vào các lớp và phương thức, bạn có thể tạo ra mã nguồn rõ ràng, dễ bảo trì và dễ mở rộng. Việc sử dụng OOP trong phát triển ứng dụng Tkinter không chỉ giúp tổ chức mã nguồn một cách khoa học mà còn nâng cao hiệu quả làm việc và khả năng mở rộng của ứng dụng. Hy vọng rằng, với những kiến thức đã học, bạn sẽ tự tin hơn trong việc phát triển các ứng dụng GUI phức tạp hơn trong tương lai.