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
.png)
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.converttrong 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ủaframestrù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ả.

Các kiểu dữ liệu trong C ( int - float - double - char ...)
Thuật toán tìm ước chung lớn nhất trong C/C++
Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)
ComboBox - ListBox trong lập trình C# winforms
Random trong Python: Tạo số random ngẫu nhiên
Lệnh cin và cout trong C++
Cách khai báo biến trong PHP, các loại biến thường gặp
Download và cài đặt Vertrigo Server
Thẻ li trong HTML
Thẻ article trong HTML5
Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên
Cách dùng thẻ img trong HTML và các thuộc tính của img
Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng