Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Phương thức tkraise() của Frame trong Tkinter
Trong ứng dụng Tkinter, việc chuyển đổi giữa các Frame là một tính năng phổ biến để hiển thị nội dung tương ứng với các lựa chọn của người dùng. Để thực hiện điều này, phương thức tkraise()
của widget Frame cho phép chúng ta dễ dàng nâng một Frame lên trên các Frame khác, giúp thay đổi giao diện một cách linh hoạt. Trong bài viết này, bạn sẽ học cách sử dụng phương thức tkraise()
để quản lý và chuyển đổi giữa các Frame trong một ứng dụng Tkinter, tạo nên trải nghiệm người dùng mượt mà và trực quan.
Giới thiệu về phương thức tkraise()
Của Frame trong Tkinter
Thông thường, một ứng dụng Tkinter có thể bao gồm nhiều Frame khác nhau. Bạn thường cần chuyển đổi giữa các Frame để hiển thị nội dung phù hợp với lựa chọn của người dùng.
Tkinter cho phép bạn xếp các Frame chồng lên nhau. Để hiển thị một Frame cụ thể, bạn chỉ cần nâng Frame đó lên trên các Frame khác trong thứ tự xếp chồng. Frame được nâng lên trên cùng sẽ được hiển thị.
Để nâng một Frame lên trên cùng, bạn sử dụng phương thức tkraise()
của widget Frame như sau:
Bài viết này được đăng tại [free tuts .net]
frame.tkraise()
Ví dụ về phương thức tkraise()
của Frame trong Tkinter
Trong ví dụ này, bạn sẽ mở rộng ứng dụng chuyển đổi nhiệt độ bằng cách thêm tính năng chuyển đổi nhiệt độ từ Celsius sang Fahrenheit.
Mặc định, ứng dụng chuyển đổi nhiệt độ từ Fahrenheit sang Celsius. Nếu bạn chọn radio button "C to F", ứng dụng sẽ hiển thị một Frame mới cho phép bạn chuyển đổi nhiệt độ từ Celsius sang Fahrenheit.
Để xây dựng ứng dụng này, bạn cần có ba widget chính:
- Một cửa sổ gốc (root window).
- Frame chuyển đổi (ConverterFrame) để hiển thị các trường nhập liệu.
- Frame điều khiển (ControlFrame) để hiển thị các radio button.
Frame chuyển đổi (ConverterFrame) sẽ có hai phiên bản: một phiên bản chuyển đổi nhiệt độ từ Fahrenheit sang Celsius, và phiên bản còn lại chuyển đổi nhiệt độ từ Celsius sang Fahrenheit.
Bước 1: Định nghĩa lớp TemperatureConverter
Đầu tiên, định nghĩa một lớp TemperatureConverter
với hai phương thức tĩnh: fahrenheit_to_celsius
và celsius_to_fahrenheit
.
class TemperatureConverter: @staticmethod def fahrenheit_to_celsius(f, format=True): result = (f - 32) * 5/9 if format: return f'{f} Fahrenheit = {result:.2f} Celsius' return result @staticmethod def celsius_to_fahrenheit(c, format=True): result = c * 9/5 + 32 if format: return f'{c} Celsius = {result:.2f} Fahrenheit' return result
Hai phương thức fahrenheit_to_celsius
và celsius_to_fahrenheit
sẽ trả về một chuỗi đã định dạng nếu bạn không cung cấp đối số thứ hai hoặc truyền vào giá trị True
. Ngược lại, chúng sẽ trả về kết quả dưới dạng số.
Bước 2: Định nghĩa lớp ConverterFrame
Tiếp theo, định nghĩa lớp ConverterFrame
sẽ hiển thị giao diện người dùng để chuyển đổi nhiệt độ từ Fahrenheit sang Celsius và ngược lại.
Để làm điều này, bạn cần làm cho ConverterFrame
trở nên linh hoạt hơn bằng cách thêm các tham số sau vào phương thức __init__()
:
- Một chuỗi sẽ được hiển thị dưới dạng Fahrenheit và Celsius.
- Một hàm callback để chuyển đổi nhiệt độ.
Dưới đây là lớp ConverterFrame
hoàn chỉnh:
class ConverterFrame(ttk.Frame): def __init__(self, container, unit_from, converter): super().__init__(container) self.unit_from = unit_from self.converter = converter # Tùy chọn cho các trường nhập liệu options = {'padx': 5, 'pady': 0} # Nhãn nhiệt độ self.temperature_label = ttk.Label(self, text=self.unit_from) self.temperature_label.grid(column=0, row=0, sticky='w', **options) # Trường 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, sticky='w', **options) self.temperature_entry.focus() # Nút chuyển đổi self.convert_button = ttk.Button(self, text='Convert') self.convert_button.grid(column=2, row=0, sticky='w', **options) self.convert_button.configure(command=self.convert) # Nhãn kết quả self.result_label = ttk.Label(self) self.result_label.grid(row=1, columnspan=3, **options) # Thêm lề vào Frame và hiển thị nó self.grid(column=0, row=0, padx=5, pady=5, sticky="nsew") def convert(self, event=None): """Xử lý sự kiện nhấp chuột vào nút""" try: input_value = float(self.temperature.get()) result = self.converter(input_value) self.result_label.config(text=result) except ValueError as error: showerror(title='Error', message=error) def reset(self): self.temperature_entry.delete(0, "end") self.result_label.text = ''
Cách hoạt động:
- Sử dụng tham số
unit_from
để hiển thị nhãn cho nhiệt độ. - Gọi hàm callback
self.convert
trong phương thứcconvert()
để chuyển đổi nhiệt độ từ một đơn vị sang đơn vị khác. - Định nghĩa phương thức
reset()
để xóa nội dung của trường nhập liệu và nhãn kết quả khi Frame chuyển đổi từ Frame này sang Frame khác.
Bước 3: Định nghĩa lớp ControlFrame
Tiếp theo, định nghĩa lớp ControlFrame
hiển thị các radio button để lựa chọn Frame hiển thị. Lớp ControlFrame
kế thừa từ ttk.LabelFrame
.
class ControlFrame(ttk.LabelFrame): def __init__(self, container): super().__init__(container) self['text'] = 'Options' # Các radio button self.selected_value = tk.IntVar() ttk.Radiobutton( self, text='F to C', value=0, variable=self.selected_value, command=self.change_frame).grid(column=0, row=0, padx=5, pady=5) ttk.Radiobutton( self, text='C to F', value=1, variable=self.selected_value, command=self.change_frame).grid(column=1, row=0, padx=5, pady=5) self.grid(column=0, row=1, padx=5, pady=5, sticky='ew') # Khởi tạo các Frame self.frames = {} self.frames[0] = ConverterFrame( container, 'Fahrenheit', TemperatureConverter.fahrenheit_to_celsius) self.frames[1] = ConverterFrame( container, 'Celsius', TemperatureConverter.celsius_to_fahrenheit) self.change_frame() def change_frame(self): frame = self.frames[self.selected_value.get()] frame.reset() frame.tkraise()
Cách hoạt động:
- Mỗi radio button chứa một giá trị là 0 hoặc 1.
- Tạo hai phiên bản của lớp
ConverterFrame
, một phiên bản để chuyển đổi nhiệt độ từ Fahrenheit sang Celsius, và phiên bản kia để chuyển đổi từ Celsius sang Fahrenheit. Cũng định nghĩa một dictionary để lưu trữ các Frame này. Các key củaframes
trùng với giá trị của các radio button. - Khi một radio button được nhấp, phương thức
change_frame()
sẽ được gọi để chọn Frame tương ứng từ dictionary dựa trên giá trị của radio button đã chọn. - Gọi phương thức
reset()
của Frame để đặt lại trường nhập liệu và nhãn kết quả. Sau đó, gọi phương thứctkraise()
để hiển thị Frame.
Bước 4: Định nghĩa lớp App
Cuối cùng, định nghĩa 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('300x120') self.resizable(False, False)
Bước 5: Khởi động ứng dụng
Khởi động ứng dụng từ khối if __name__ == "__main__"
:
if __name__ == "__main__": app = App() ControlFrame(app) app.mainloop()
Kết bài
Kết luận, phương thức tkraise()
trong Tkinter là công cụ mạnh mẽ giúp bạn quản lý và chuyển đổi giữa các Frame trong ứng dụng của mình. Bằng cách sử dụng tkraise()
, bạn có thể dễ dàng nâng một Frame lên trên danh sách các Frame khác, từ đó hiển thị Frame đó trong giao diện người dùng một cách trực quan và linh hoạt. Phương pháp này không chỉ cải thiện trải nghiệm người dùng mà còn giúp tổ chức giao diện của ứng dụng một cách hiệu quả.