私はオブジェクト指向のアプローチを提唱しています。これは私が最初に使用するテンプレートです:
# Use Tkinter for python 2, tkinter for python 3
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
<create the rest of your GUI here>
if __name__ == "__main__":
root = tk.Tk()
MainApplication(root).pack(side="top", fill="both", expand=True)
root.mainloop()
注意すべき重要な点は次のとおりです。
ワイルドカードインポートは使用しません。パッケージを「tk」としてインポートします。これには、すべてのコマンドの前にを付ける必要がありますtk.
。これにより、グローバルな名前空間の汚染が防止され、さらにTkinterクラス、ttkクラス、または独自のクラスを使用しているときにコードが完全に明らかになります。
主なアプリケーションはクラスです。これにより、すべてのコールバックとプライベート関数にプライベート名前空間が提供され、通常はコードの編成が簡単になります。手続き型のスタイルでは、トップダウンでコードを記述したり、使用する前に関数を定義したりする必要があります。この方法では、最後の手順まで実際にメインウィンドウを作成しないため、この方法は必要ありません。私tk.Frame
は通常フレームを作成することから始めるので、継承を好むが、それは決して必要ではない。
アプリに追加のトップレベルウィンドウがある場合は、それらを個別のクラスにして、から継承することをお勧めしtk.Toplevel
ます。これにより、上記と同じ利点がすべて得られます。ウィンドウはアトミックであり、ウィンドウには独自の名前空間があり、コードはよく構成されています。さらに、コードが大きくなり始めたら、それぞれを独自のモジュールに簡単に配置できます。
最後に、インターフェースのすべての主要部分にクラスを使用することを検討する必要があるかもしれません。たとえば、ツールバー、ナビゲーションペイン、ステータスバー、メイン領域を備えたアプリを作成している場合、これらのクラスをそれぞれ作成できます。これにより、メインコードが非常に小さくなり、理解しやすくなります。
class Navbar(tk.Frame): ...
class Toolbar(tk.Frame): ...
class Statusbar(tk.Frame): ...
class Main(tk.Frame): ...
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.statusbar = Statusbar(self, ...)
self.toolbar = Toolbar(self, ...)
self.navbar = Navbar(self, ...)
self.main = Main(self, ...)
self.statusbar.pack(side="bottom", fill="x")
self.toolbar.pack(side="top", fill="x")
self.navbar.pack(side="left", fill="y")
self.main.pack(side="right", fill="both", expand=True)
これらのインスタンスはすべて共通の親を共有しているため、親は事実上、モデルビューコントローラーアーキテクチャの「コントローラー」部分になります。したがって、たとえば、メインウィンドウはを呼び出すことでステータスバーに何かを配置できますself.parent.statusbar.set("Hello, world")
。これにより、コンポーネント間のシンプルなインターフェースを定義することができ、最小限の結合を維持するのに役立ちます。