6

私の問題は次のとおりです。Web のバックグラウンドから来て、これを行うのに問題はありませんでしたが、Python デスクトップ アプリケーションでは、MVC パターンに従ってコードを整理する最善の方法が実際にはわかりません。

ユーザー入力に従ってボタンを押すと、データベースで利用可能な同様のエントリが表示されるウィンドウを作成したいと考えています。窓は私の視点です。

したがって、基本的にこれらの関係は次のとおりです。

ここに画像の説明を入力

1)通信コントローラ --> ビュー

コントローラーにはビューのインスタンスがあり、view.show_data() などの公開されたメソッドを使用できます。これが進むべき道だと思います。

# Controller
my_view = View()
...
my_view.show_data(whatever_data)

2)通信ビュー --> コントローラ

ユーザーがテキストを挿入すると、コントローラーのメソッドが起動され、データベース内の必要なデータをモデルに要求できるようになります。問題は、ビューがコントローラーにそのメソッドを起動する必要があることを伝える最良の方法がわからないことです。

私の最初のアイデアは、コントローラーの参照をビューに渡し、ビューにイベントをバインドすることです。次のようになります。

# Controller
my_view = View(self)
my_model = Model()
...

def on_user_input(self):
     # process the input
     user_input = ...
     self.my_model.method_to_get_info(user_input)

そしてビュー:

# View
def __init__(self, controller):
    self.controller_reference = controller
    self.launch_gui()
    self.config_binds()

def launch_gui(self):
    # ... configure all the GUI itself
    self.button = ...


def config_binds(self):
    self.button.Bind(wx.EVT_BUTTON, self.controller_reference.on_user_input())

しかし、この「閉じた円」の関係はあまりきれいな解決策ではないと思います。ビューはコントローラーで参照され、コントローラーはビューで参照されます。ビューとコントローラーの間に緊密な関係が生まれると思います。

これを行う方法は何ですか?

4

1 に答える 1

4

ビューはイベントを発生させるはずです。通常、イベントをコントローラーに直接送信するのではなく、GUI のフレームワークの汎用イベント ハンドラーに送信します。問題のイベントは通常、「キーが押された」や「誰かがマウスを動かした」などのイベントです。

あなたの場合のように、より「高レベル」の MVC は、パーツにお互いをよく知らせることができます。どのオブジェクトがコントローラーであるかをビューに伝えることは、まったく問題ありません。重要な部分は、パーツが交換可能であるように、すべてのパーツが明確に定義されたインターフェースを使用していることです。

ご覧のとおり、これはモデル ビュー コントローラーの一般的な Web 概念とはまったく異なります。モデル ビュー コントローラーは実際にはまったくモデル ビュー コントローラーではありませんが、誤称であり、モデル ビュー テンプレートと呼ばれる必要があります。

于 2013-01-08T12:28:08.463 に答える