ウィジェットをサブクラス化してカスタムウィジェットを作成するのは非常に普通です。ただし、このカスタムウィジェットが複数のウィジェットで構成されている場合は、通常はサブクラスFrame
となります。テキストを挿入するとき、内部テキストウィジェットを参照する必要がどのように気づく、このアプローチでは
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()
:たとえば、私はこのような何かをするだろう、スクロールバー付きのテキストウィジェットですウィジェットを作成します。このウィジェットを実際のテキストウィジェットのように見せたい場合は、テキストウィジェット関数の一部またはすべてへのマッピングを作成できます。たとえば、
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()
私が尋ねるのは、カスタムウィジェットを作成するために、Tkinter.Text(またはそのメソッドと関数を保持する他のウィジェット)をサブクラス化することをお勧めしますか?この場合、Tkinter.Textをサブクラス化して、スクロールバーをクラス内のフレームに配置します。または、フレームをサブクラス化して、テキストウィジェットとスクロールバーを直接配置して、独自のメソッドや関数を作成する必要がありますか? – user2830098
私の答えの更新を参照してください –