私はオブジェクト指向のアプローチを提唱しています。これは私が最初に使用するテンプレートです。
# 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
. これにより、上記と同じ利点がすべて得られます。ウィンドウはアトミックであり、独自の名前空間があり、コードは適切に編成されています。さらに、コードが大きくなり始めたら、それぞれを独自のモジュールに簡単に配置できます。
最後に、インターフェイスのすべての主要部分にクラスを使用することを検討することをお勧めします。たとえば、ツールバー、ナビゲーション ペイン、ステータスバー、およびメイン領域を備えたアプリを作成している場合、これらのクラスをそれぞれ 1 つ作成できます。これにより、メイン コードが非常に小さくなり、理解しやすくなります。
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")
。これにより、コンポーネント間のシンプルなインターフェースを定義でき、最小限の結合を維持するのに役立ちます。