2015-09-30 3 views
5

が、私は以下のコードが何を意味するのか理解したい__init__:理解親とコントローラが

class PageOne(tk.Frame): 

    def __init__(self, parent, controller): 

selfparentcontroller何ですか?これらのツールの役割と範囲は?

selfはJavaのthisと似ていますが、parentcontrollerはどういう意味ですか?その後、私が見ることができるコードフローで

button1 = tk.Button(self, text="Back to Home", 
     command=lambda: controller.show_frame(StartPage)) 

ありshow_frame呼ばれ、すでに定義された関数があるが、なぜコントローラは、この関数を呼び出すために使用されていますか?

+0

彼らは、メソッドへのパラメータです。あなたについて何を混乱させるのですか?インスタンス化呼び出しに渡されたパラメータを使って自動的に呼び出される点を除いて、ここでは '__init__'は特別なことはありません。 –

+0

* "私は自己がJavaのこれと似ていると信じています" * - そうです。 * "親とコントローラの使い方は何ですか?" * - それらは2つの初期化パラメータです。Tkinterでは、新しいウィジェットがそれぞれの新しいウィジェットに置かれる 'parent'ウィジェットを渡して、UI全体のツリーを定義します。 'controller'は明らかに、グローバルな変更を担当するウィジェットを作るのではなく、UI全体を制御するために使用できるものです。 – jonrsharpe

+0

コードはhttp://stackoverflow.com/q/29444725/3001761 – jonrsharpe

答えて

9

おおまかに言えば、元のコードは、擬似MVC(モデル、ビュー、コントローラ)アーキテクチャを使用しようとしました。 「モデル」の部分がなくても、単に「ビュー」(一部のフレーム)と「コントローラ」(メインアプリケーション)がありました。したがって、コントローラオブジェクトへの参照。元のコードは実際にフレームを「スタック」する方法を示すために書かれていたので、MVCの実装は非常に浅く、文書化されていません。あなたの特定の質問に答えるために

自己現在のオブジェクトを表します。これは、クラスのメソッドの共通の最初のパラメータです。あなたが提案したように、それはJavaのと同じです。これはです。

は、現在のオブジェクトの親として機能するウィジェットを表します。ルートウィンドウ以外のtkinterのすべてのウィジェットには親が必要です。

コントローラは、ウィジェットのいくつかのページの共通の対話ポイントとして機能するように設計された他のオブジェクトを表します。ページを切り離す試みです。つまり、各ページは他のページについて知る必要はありません。表示させるなど、別のページとやりとりしたい場合は、コントローラーに表示させるように要求することができます。

"show_frameという名前の関数が既に定義されていますが、なぜこの関数を呼び出すためにコントローラが使用されていますか?"show_frameは、別のクラス(この場合はメインプログラムクラス)で定義されています。他のクラスでは定義されていません。他のクラスが呼び出すことができるようにするには、メインクラスのインスタンスで呼び出す必要があります。そのインスタンスは、これらの他のクラスの文脈でcontrollerという名前です。


注:あなたはおそらくオンラインチュートリアルでは、元のコードを発見したにも関わらず、それはもともと、このstackoverflowの答えから来た:Switch between two frames in tkinter

+0

完了!私はちょうどあなたの答えをここで何度も繰り返し、コードと並行して読むことができます。コードはうまくいきますが、ここで何が起こっているのかを理解することなく進めたくありませんでした!ブライアン、ありがとう! –

+0

ちょうど1つの質問なので、クラスはtkinterプログラムのメインループでどのように初期化され、初期化されているクラスに "コントローラ"をスローしますか?これは__INIT __で捕捉され、初期化されたコントローラです。 –

+0

@VasanthNagKV:「スロー」は奇妙な言葉です。しかし、はい、メインプログラムは "コントローラ"パラメータとして各オブジェクトに渡されています。 –

関連する問題