Trong quá trình lập trình bằng Python, bạn có thể cần truy cập các biến cùng một cách từ nhiều lớp khác nhau. Ví dụ, bạn có thể có một lớp cha chứa một biến và muốn lớp con truy cập vào biến đó. Tuy nhiên, khi bạn thử làm điều này, bạn có thể thấy rằng biến không thể truy cập được.
Giải Pháp
Để giải quyết vấn đề này, bạn có thể sử dụng một trong các phương pháp sau:
- Sử dụng biến toàn cục.
label_main = Label()
- Sử dụng biến thành viên của lớp.
class Lop_Cha:
label_main = Label()
- Sử dụng decorator thuộc tính.
class Lop_Cha:
@property
def label_main(self):
return self._label_main
@label_main.setter
def label_main(self, value):
self._label_main = value
- Sử dụng xử lý sự kiện.
class Lop_Cha:
def __init__(self, master):
self.label_main = Label(master)
self.label_main.bind("<Button-1>", self.on_click)
def on_click(self, event):
self.label_main["text"] = "Tôi đang ở lớp Cha."
- Sử dụng ủy quyền.
class Lop_Cha:
def __init__(self, master):
self.label_main = Label(master)
class Lop_Con(Lop_Cha):
def __init__(self, master):
Lop_Cha.__init__(self, master)
self.label_main["text"] = "Tôi đang ở lớp Con."
Ví Dụ Mã
from tkinter import *
class Lop_Cha(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid()
self.tao_label()
def tao_label(self):
self.label_main = Label(self)
self.label_main["text"] = "Tôi đang ở lớp Cha."
self.label_main.grid(row=0, column=0, sticky=W)
class Lop_Con(Lop_Cha):
def __init__(self, master):
Lop_Cha.__init__(self, master)
self.sua_label()
def sua_label(self):
self.label_main["text"] = "Tôi đang ở lớp Con."
window = Tk()
window.title("Kiểm Tra Nhãn")
window.geometry("250x250")
app = Lop_Con(window)
window.mainloop()
Trong ví dụ trên, chúng ta đã khai báo label_main là một biến thành viên của Lop_Cha. Điều này cho phép truy cập label_main từ Lop_Con.
Biến Toàn Cục
label_main = Label()
class Lop_Cha(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid()
self.tao_label()
def tao_label(self):
global label_main
label_main["text"] = "Tôi đang ở lớp Cha."
label_main.grid(row=0, column=0, sticky=W)
class Lop_Con(Lop_Cha):
def __init__(self, master):
Lop_Cha.__init__(self, master)
self.sua_label()
def sua_label(self):
global label_main
label_main["text"] = "Tôi đang ở lớp Con."
window = Tk()
window.title("Kiểm Tra Nhãn")
window.geometry("250x250")
app = Lop_Con(window)
window.mainloop()
Decorator Thuộc Tính
from tkinter import *
class Lop_Cha(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid()
self.tao_label()
@property
def label_main(self):
return self._label_main
@label_main.setter
def label_main(self, value):
self._label_main = value
def tao_label(self):
self._label_main = Label(self)
self._label_main["text"] = "Tôi đang ở lớp Cha."
self._label_main.grid(row=0, column=0, sticky=W)
class Lop_Con(Lop_Cha):
def __init__(self, master):
Lop_Cha.__init__(self, master)
self.sua_label()
def sua_label(self):
self.label_main["text"] = "Tôi đang ở lớp Con."
window = Tk()
window.title("Kiểm Tra Nhãn")
window.geometry("250x250")
app = Lop_Con(window)
window.mainloop()
Xử Lý Sự Kiện
from tkinter import *
class Lop_Cha(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid()
self.tao_label()
def tao_label(self):
self.label_main = Label(self)
self.label_main["text"] = "Tôi đang ở lớp Cha."
self.label_main.grid(row=0, column=0, sticky=W)
self.label_main.bind("<Button-1>", self.on_click)
def on_click(self, event):
self.label_main["text"] = "Tôi đang ở lớp Cha."
class Lop_Con(Lop_Cha):
def __init__(self, master):
Lop_Cha.__init__(self, master)
self.sua_label()
def sua_label(self):
self.label_main["text"] = "Tôi đang ở lớp Con."
window = Tk()
window.title("Kiểm Tra Nhãn")
window.geometry("250x250")
app = Lop_Con(window)
window.mainloop()
Ủy Quyền
from tkinter import *
class Lop_Cha(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid()
self.tao_label()
def tao_label(self):
self.label_main = Label(self)
self.label_main["text"] = "Tôi đang ở lớp Cha."
self.label_main.grid(row=0, column=0, sticky=W)
class Lop_Con(Lop_Cha):
def __init__(self, master):
Lop_Cha.__init__(self, master)
self.sua_label()
def sua_label(self):
self.label_main["text"] = "Tôi đang ở lớp Con."
window = Tk()
window.title("Kiểm Tra Nhãn")
window.geometry("250x250")
app = Lop_Con(window)
window.mainloop()