2011-01-25 5 views
2

私はtkinterを使用しますが、私の質問は多分一般的です。gui design question

私はGUIを設計しているのは初めてです。私のオブジェクトはそれぞれクラスとしてモデル化されています。私はGUIクラス階層を残りのクラス階層と結ぶ方法を理解していません。私はキャンバス上で動き回る円としてそれらを表示したい

# this is before I had any GUI in my code 
class Creature: 
    def current_position() # returns real-time x, y coords 
    # ... 

は例えば、私は生き物を持っています。動きの図形表現は、class Creatureupdate_displayという方法で提供する必要があります。しかし、それはがGUIについての詳細を知っていなければならないことを意味します。さらにclass App(tkinter.Tk)redrawメソッドを使用すると、update_displayメソッドを呼び出すために、すべての既存のCreatureインスタンスのリストを知る必要があります。それはあまりにも多くの依存関係です。

正しいアプローチは何ですか?

答えて

4

一般的に受け入れられているパターンは、モデル/ビュー/コントローラです。コントローラーオブジェクトは、すべての生き物(あなたの "モデル")とGUI(あなたの "ビュー")について知っています。コントローラは、2つの接続を担当します。たとえば、ビューには、クリーチャーを入力として受け入れる「draw_creature」メソッドがあります。コントローラーは、クリーチャーを反復し、1つずつビューに渡します。または、各クリーチャーは、ビューをパラメーターとして受け入れる「描画」メソッドを持ち、ビューは各クリーチャーに自身を描き、ビューへの参照を渡します。

このパターンを使用すると、複数のビューを簡単に作成できますが、それらについて知るために更新する必要はありません。同様に、生き物をどのように保管し、管理するかを変えることができ、そのことについては何も知る必要はありません。

+0

ありがとうございます。私はそれについてもっと読むために行く必要がある参照はありますか? (または、それはまるで簡単ですか?) – max

+0

1つのアプローチでは、tkやその他のGUIフレームワークを使用しているかどうかを知る必要があります。そうでなければ、リファレンス?もう一つのアプローチでは、生き物の参照に基づいてそれらを描くことができるならば、GUIは生き物についてかなり多くを知る必要があります。もともと私が苦労していたものよりも優れていますが、GUIとモデルの依存関係を完全に取り除くわけではありません。それとも私は何かを誤解しましたか? – max

+0

@max - あなたは正しいです。デカップリングの量は、投資したい時間の要素です。通常、モデルはビューに依存しません。しかし、そのビューは、それが動作しなければならないオブジェクトについて知る必要があります。ビューを作成して、すべての可能なモデルで機能させることはできません。ビューはあなたの生き物との疎結合を必要とします。たとえば、「get_position」や「get_name」などを呼び出すことができます。抽象化とは、単にtneyがどのように作成、格納されているかを知る必要がないということです。 –