Podklas widgetu jest bardzo normalny, aby utworzyć niestandardowy. Jeśli jednak ten niestandardowy widget składa się z więcej niż jednego widżetu, zwykle należy podklasę Frame
. Na przykład, aby utworzyć widget, który jest widget tekst z paska przewijania chciałbym zrobić coś takiego:
import Tkinter as tk
class ScrolledText(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent)
self.text = tk.Text(self, *args, **kwargs)
self.vsb = tk.Scrollbar(self, orient="vertical", command=self.text.yview)
self.text.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side="right", fill="y")
self.text.pack(side="left", fill="both", expand=True)
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.scrolled_text = ScrolledText(self)
self.scrolled_text.pack(side="top", fill="both", expand=True)
with open(__file__, "r") as f:
self.scrolled_text.text.insert("1.0", f.read())
root = tk.Tk()
Example(root).pack(side="top", fill="both", expand=True)
root.mainloop()
Dzięki takiemu podejściu, zauważyć, jak trzeba odwoływać wewnętrzną widget tekstowy podczas wstawiania tekstu. Jeśli chcesz, aby ten widget wyglądał bardziej jak prawdziwy widget tekstowy, możesz utworzyć mapowanie do niektórych lub wszystkich funkcji widżetu tekstowego. Na przykład:
import Tkinter as tk
class ScrolledText(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent)
self.text = tk.Text(self, *args, **kwargs)
self.vsb = tk.Scrollbar(self, orient="vertical", command=self.text.yview)
self.text.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side="right", fill="y")
self.text.pack(side="left", fill="both", expand=True)
# expose some text methods as methods on this object
self.insert = self.text.insert
self.delete = self.text.delete
self.mark_set = self.text.mark_set
self.get = self.text.get
self.index = self.text.index
self.search = self.text.search
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.scrolled_text = ScrolledText(self)
self.scrolled_text.pack(side="top", fill="both", expand=True)
with open(__file__, "r") as f:
self.scrolled_text.insert("1.0", f.read())
root = tk.Tk()
Example(root).pack(side="top", fill="both", expand=True)
root.mainloop()
Próbuję zadać to, czy jest to dobra praktyka, aby podklasy Tkinter.Text (lub dowolny inny widżet, aby zachować to metody i funkcje), aby utworzyć własny widget. W tym przypadku podklasuję Tkinter.Text, umieszczając go na pasku przewijania na ramce w mojej klasie. Czy powinienem podklasować klatkę i umieścić bezpośrednio na niej widżet tekstowy i pasek przewijania oraz tworzyć własne metody i funkcje? – user2830098
Zobacz aktualizację mojej odpowiedzi –